我试图了解我的错误是来自设计问题还是代码错误。我的搜索指出了切片问题,但我不认为这是问题所在。
#include <string>
#include <iostream>
#include <vector>
class BaseA {
public:
BaseA(const std::string &n)
: name(n)
{}
virtual ~BaseA()
{};
virtual void print() const
{
std::string str("");
str += name;
std::cout << str << std::endl;
}
protected:
std::string name;
};
class BaseB : public BaseA {
public:
BaseB(const std::string &n, const std::string &v)
: BaseA(n), value(v)
{
load();
}
virtual ~BaseB()
{};
virtual void load(){
c = 'B';
}
char getC() {
return c;
}
void print() const{
std::string str("");
str += name;
str += ' ';
str += value;
std::cout << str << std::endl;
}
protected:
char c;
private:
std::string value;
int data = 0;
};
class BaseC : public BaseB {
public:
BaseC(const std::string &n, const std::string &v)
: BaseB(n, v)
{
}
void load() override{
c = 'C';
}
};
int mainTest()
{
std::vector<BaseB*> vec;
vec.push_back(new BaseB("John", "singer"));
vec.push_back(new BaseC("Raoul", "wannabe"));
for (BaseB *obj : vec)
{
obj->print();
std::cout << "load class: " << obj->getC() << std::endl;
}
return(0);
};
我希望结果是:
John singer
load class: B
Raoul wannabe
load class: C
但我两个都得到B.这是否意味着在构造函数中,不可能使用重写的类? 感谢
答案 0 :(得分:3)
这不是不可能的,但它可能不会做你想要的。
回想一下,对于BaseC
,构造顺序为BaseA
,BaseB
,BaseC
。
正在构造BaseB
(构造函数执行)时,没有BaseC
这样的对象,即使它是作为BaseC
构造的一部分构造的。
因此,标准规定在BaseB
的构造函数(和析构函数)期间,调用load()
将导致BaseB::load()
被调用。不是BaseC::load()