繁体   English   中英

C++:多态性、初始化列表和常量变量

[英]C++: polymorphism, initialization lists and const variables

假设我有 2 节课:

class A {
private:
    int x;
    const int y;
public:
    A(int x) : x(x) {}
    virtual foo() = 0;
}

class B : public A {
public:
    B(int x, int y) : A(x), y(y) {}
}

这是我对调用 B 的构造函数时会发生什么的理解:

这段代码最后一行不好,因为 const int y 是 A 的成员,所以在调用 A 的构造函数时隐式初始化了,所以不能在 B 的构造函数中再次初始化。因为它是常量。

如何通过 B 的构造函数初始化 y,而它仍然是 const 并且仍然在 A 中定义?

换句话说,我想调用A的初始化列表,然后是B的初始化列表,然后是A的主体,然后是B的主体。

编辑:改写我的问题:假设我有一个抽象的 class A,B 和 C 继承自它。 我想在 A 的每个子类中保存一个 const 变量 X。X 的值取决于我们所在的子类(B/C)。 初始化应该如何工作?

如何通过 B 的构造函数初始化 y,而它仍然是 const 并且仍然在 A 中定义?

A的构造函数必须完全初始化A ,因此它必须初始化y 如果它自己不能这样做,则必须向它提供这样做的信息。

class A {
private:
    int x;
    const int y;
public:
    A(int x, int y) : x(x), y(y) {}
}

B必须提供该信息:

class B : public A {
public:
    B(int x, int y) : A(x, y) {}
}

换句话说,我想调用A的初始化列表,然后是B的初始化列表,然后是A的主体,然后是B的主体。

那不会解决任何问题。 B的初始化列表无法初始化A的成员,并且两者的主体都无法初始化 const 成员。 所以即使你有能力以这种方式订购东西,我们没有,唯一初始化y的地方是A的初始化列表,和以前一样。

编辑:改写我的问题:假设我有一个抽象的 class A,B 和 C 继承自它。 我想在 A 的每个子类中保存一个 const 变量 X。X 的值取决于我们所在的子类(B/C)。 初始化应该如何工作?

A的构造函数可以带一个参数来初始化 const 成员,派生的 class 构造函数可以传递它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM