0

I want the Print() function, declared virtual in the base class ParticleType , to print on screen, other than the correct values for mass_ and charge the correct value for width. The function works as intended for the base class. Here is my code :

ParticleType.h

#ifndef PARTICLETYPE_H
#define PARTICLETYPE_H
#include <iostream>

class ParticleType {

public:

ParticleType(char name, double mass, int charge) ;

ParticleType() ;

char Getname() const  ;
double Getmass() const ;
int Getcharge() const  ;
virtual double Getwidth() const ;

virtual void Print() const  ;

private:
char const name_ ;
const double mass_ ;
const int charge_;
} ;
#endif

ParticleType.C

#include "ParticleType.h"

ParticleType::ParticleType(char name, double mass, int charge) :
name_{name} , mass_{mass} , charge_{charge} {};

ParticleType::ParticleType() :
name_{'v'} , mass_{0} , charge_{0} {} ;

char ParticleType::Getname() const {
 return name_ ;
} 

double ParticleType::Getmass() const {
    return mass_;
}

int ParticleType::Getcharge() const {
    return charge_ ;
}

double ParticleType::Getwidth() const {
    return 0;
}

void ParticleType::Print() const  {
    std::cout << "Name: " << Getname() << " Mass: " << Getmass() << " Charge: " << Getcharge()
    << '\n';
}

ResonanceType.h

#ifndef RESONANCETYPE_H
#define RESONANCETYPE_H
#include "ParticleType.h"

class ResonanceType : virtual public ParticleType {
 public :
 
ResonanceType(char name, double mass, int charge, double width) ;

ResonanceType() ;

double Getwidth() const ;

void Print() const ;

 private:

const double width_ ;

} ;

#endif

ResonanceType.C

#include "ResonanceType.h"

ResonanceType::ResonanceType(char name, double mass, int charge, double width) :
ParticleType(name,charge,mass), width_{width}  {}; 

ResonanceType::ResonanceType() : 
ParticleType() , width_{}  {};

double ResonanceType::Getwidth() const {
    return width_ ;
}

void ResonanceType::Print() const {
    ParticleType::Print();
    std::cout << "Width : " << Getwidth() << '\n' ;
}

and finally my main

#include "ResonanceType.h"
#include <vector>

int main() {
    std::vector<ParticleType> v ;
    ResonanceType r = ResonanceType('k',0.89166,0,0.050) ;
    ParticleType p = ParticleType('p',0.13957,1) ;
    v.push_back(r);
    v.push_back(p) ;
    v[0].Print() ;
    v[1].Print() ;
}

this is the output I get :

Name: k Mass: 0 Charge: 0
Name: p Mass: 0.13957 Charge: 1
Conts
  • 81
  • 5
  • @StephenNewell I don't think so, surely because I'm not understanding. I still initialize 'r' as a 'ResonanceType', does it get sliced when pushing it in the vector? – Conts May 20 '21 at 16:19
  • 2
    Since the vector stores only `ParticleType` objects, pushiing a `ResonanceType` object into it will slice the object and only store the base `ParticleType` of `r`. – 1201ProgramAlarm May 20 '21 at 16:21
  • 1
    Also see [What is object slicing?](https://stackoverflow.com/questions/274626/what-is-object-slicing). – 1201ProgramAlarm May 20 '21 at 16:22

0 Answers0