我有一个庞大的 C++ 代码库正在使用。
我想引入一个新的子类,并在各种不同的上下文中使用它,但是我受过 Java 训练的头脑在 C++ 中遇到了这个问题。
我希望尽量减少代码更改。因此,我感兴趣的主要类(下面的 BAR
)有一个 FOO
类的成员变量。我希望创建一个名为 FOOSUBCLASS
的 FOO
子类。在java中这是微不足道的。默认情况下,对象按引用存储。此代码不执行此操作(如下所示)我能否在不更改接口(interface)(且不引入引用)的情况下修改此代码并仍然使我的应用程序正常工作?
class FOO {
};
class FOOSUBCLASS : FOO {
public:
FOOSUBCLASS(const int id) {_id = id;}
private:
int _id;
};
class BAR {
public:
BAR(const FOO foo) { _foo = foo;}
private:
FOO _foo;
};
下面是我的主要内容:
FOOSUBCLASS fsc(1);
BAR b(fsc);
但这不能在 VS2005 中编译。它说:
“type cast”:存在从“FOOSUBCLASS *”到“const FOO &”的转换,但无法访问
如果我将明显的其他构造函数添加到 BAR
,则会出现相同的编译器错误
BAR(const FOOSUBCLASS foo) { _foo = foo;}
我对 C++ 的理解是,它将数据从 FOOSUBCLASS
复制到类 FOO
的对象中。 (使用赋值运算符,或者它的类重写版本)但在我的例子中,我在 FOOSUBCLASS
(和一些重写的成员函数)中有额外的成员变量,所以我只是不想让它这样做那。我希望我的成员变量 _foo
在某些情况下真正属于 FOOSUBCLASS
类型,而在其他情况下则属于 FOO
类型。这可能吗?
谢谢你的想法。
最佳答案
抱歉,你不能按照你现在写的方式去做。这称为“切片”,有关它的更多信息可在此处找到:What is object slicing?
如果您希望您的 _foo
成员是多态的,您需要使用指针或引用。当你做这样的事情时,当然要注意生命周期管理。
关于c++ - C++如何在成员变量中实例化子类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12849988/