gpt4 book ai didi

c++ - 嵌套类继承自嵌套类

转载 作者:行者123 更新时间:2023-12-02 03:42:53 25 4
gpt4 key购买 nike

我希望类C继承类A的虚函数,类D(类C中的嵌套类)继承类B(类A中的嵌套类)的数据字段,这就是我所拥有的。

文件1.h

class A{
public:
virtual void foo()=0;
class B{
public:
int data;
};
};

文件2.h

class C : public A{
public:
class D : public A::B{

};
};

文件2.cpp

void C::foo(){//code}
C::D::D():data(0){//Bad initialization list, error being data is not a member of C::D even it should inherits from its base class
data = 0; //good! compiler can see data is a member of A::B,and C::D inherits from it
}

我有两个问题,第一个问题是我正在采取正确的方法来实现这种继承。其次,正如我所评论的,为什么编译器可以在手动初始化过程中看到数据来自 A::B 而不是在初始化列表中?它们不应该在同一个范围内吗?非常感谢

编辑1:

因此,如果类 C::D(foo) 不直接继承自 A::B(foo),但 C 继承自 A,我的看法是,由于 C 继承自 A 及其所有公共(public)字段,包括其内部类 A::B(foo)、D(foo) 与 A::B(foo) 具有完全相同的名称,并且是 C 的内部类,如下所示,即两个内部类都使用 foo

class A{
public:
class foo{
public:
int data;
};
};

class C : public A{
public:
class foo{

};
};

当我直接调用 C::foo 时,编译器会感到困惑吗?因为有两个构造函数的名称在范围内?或者它选择调用“最近的”一个,例如 C:foo?而不是沿着继承链向上爬?非常感谢

最佳答案

  1. 是的,您的方法是实现这种继承的正确方法。

  2. 初始化列表用于控制传递给构造函数的参数。您可以将参数传递给 B 的构造函数,但不能直接初始化 B 的成员(这是其构造函数的工作)。如果没有为基类或成员指定构造函数,则使用默认构造函数。在您的情况下,向 B 添加一个构造函数来实现您想要的。

    class A {
    public:
    class B{
    public:
    B(int i) : data(i) {}
    int data;
    };
    };

    class C : public A {
    class D : public A::B {
    };
    };

    C::D::D() :B(0) { }

关于c++ - 嵌套类继承自嵌套类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12462781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com