Mah*_*nGM 0 c++ oop inheritance
我有这两个类:
class A
{
public:
A();
virtual ~A();
virtual void TellMyName();
};
class B : public A
{
private:
std::string szName;
public:
B();
~B();
void TellMyName();
void SetName(std::string val){ szName = val; }
};
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
void main()
{
std::vector<A*> List_A;
B* B_Instance = new B();
B_Instance->SetName("B");
List_A.push_back(B_Instance); // Way 1
List_A.push_back(new A((*B_Instance))); // Way 2
List_A[0]->TellMyName();
List_A[1]->TellMyName();
}
Run Code Online (Sandbox Code Playgroud)
TellMyName()就是要提示一个消息框.如果我使用"方式1"它没有问题,但如果我使用"方式2"它将提示没有文本的消息,这意味着B类的所有成员都是空的,就像他们从来没有被任何东西填满.我通过使用解决了这个问题std::shared_ptr,但是有没有其他方法可以不使用智能指针,因为我必须在一个大项目中实现这种方法,并且会有很多变化和失败.顺便说一下,"Way 2"的原因是什么?
List_A.push_back(new A((*B_Instance))); // Way 2
Run Code Online (Sandbox Code Playgroud)
这条线没有做你想象的那样.
您正在通过调用C++生成的默认复制构造函数在堆上创建类"A" 的新实例.该复制构造函数使用B的实例(将其视为A的实例)并进行逐字段复制,在这种情况下,它不执行任何操作.
您实际上是在创建A的空实例并将其推送到列表中.
正如许多人所提到的,这个的正式术语称为对象切片.
| 归档时间: |
|
| 查看次数: |
204 次 |
| 最近记录: |