Poylmorphim,构造函数-C 中使用的覆盖方法
Poylmorphism, overridden method used in constructor - C++
我试图了解我的错误是来自设计问题还是代码错误。我的搜索指出了切片问题,但我认为这是这里的问题。
#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。这是否意味着在构造函数中,不可能使用覆盖的类?谢谢
这不是不可能的,但可能不会做您想要的。
回想一下,对于BaseC
,施工顺序为BaseA
,BaseB
,BaseC
。
当BaseB
构造(构造函数执行)时,即使是BaseC
的对象,也没有作为BaseC
构造的一部分构造的对象。
因此,标准要求在BaseB
的构造函数(和驱动器)期间,调用load()
将导致调用BaseB::load()
。不是BaseC::load()
相关文章:
- 循环依赖,在继承类的情况下使用覆盖方法
- 确保模拟的 GTest 方法覆盖虚拟方法
- 覆盖作为另一个类的好友的虚拟受保护方法
- 如何使用方法覆盖在输出屏幕上显示堆栈整数值
- 是否有一种有效的方法来搜索队列中的关键字并覆盖其值
- 有没有办法仅在两个模板参数相同时才覆盖匹配的模板方法?
- C ++中的方法覆盖:是编译时还是运行时多态性?
- 错误"pure virtual method called",当此方法已被覆盖时
- 覆盖方法并用shared_ptr调用它们的奇怪行为
- 仅适用于某些模板类型的覆盖方法
- 在某些代码中覆盖方法的方式是什么?
- 为什么没有调用我的覆盖方法
- Poylmorphim,构造函数-C 中使用的覆盖方法
- 覆盖方法返回类型,在C 中使用不完整的派生类
- 从基类执行覆盖方法
- 如何自动化覆盖方法
- 在类模板上覆盖方法,编译器看不到它,只能看到其他重载函数
- 为什么不调用这个 Ruby 覆盖方法
- C++ 覆盖方法不起作用
- 代理dll:方法覆盖/方法转发(COM实现继承)