c++ - C++如何在成员变量中实例化子类的实例?

标签 c++ operator-overloading subclass private-members

我有一个庞大的 C++ 代码库正在使用。

我想引入一个新的子类,并在各种不同的上下文中使用它,但是我受过 Java 训练的头脑在 C++ 中遇到了这个问题。

我希望尽量减少代码更改。因此,我感兴趣的主要类(下面的 BAR)有一个 FOO 类的成员变量。我希望创建一个名为 FOOSUBCLASSFOO 子类。在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/

相关文章:

c++ - 用于访问 cpp : performance 中的成员数组元素的重载运算符

java - 如何从另一个类的静态方法中获取抽象类的子类的实例?

c++ - 在 C++ 中使用 char* 的特定字符串的子字符串

c++ - 子类族的重写方法

c++ - 复制省略和临时绑定(bind)引用对象

仅在内部类上 hibernate @Entity(顶级类不是@Entity)

python - SWIG C++ 到 Python : generate a subclass of Python list

c++ - 为什么理解这个递归示例如此难以凭直觉?

c++ - 为什么 operator char*() 在 bool 上下文中覆盖 operator bool() const?

C++ 重载运算符、赋值、深度复制和加法