gpt4 book ai didi

c++ - 我们不能从基类 : why? 继承什么

转载 作者:行者123 更新时间:2023-11-28 08:17:32 25 4
gpt4 key购买 nike

在我的第一个 C++ 类(class)结束后,我有一些问题想自己弄清楚。

我们不能继承以下内容(C++ 标准不允许): 构造函数、复制构造函数、赋值运算符和析构函数。 所以,如果我们有:

    #include <iostream>
using namespace std;

class A
{
public:
A() {cout << "CTOR of A" << endl;}
~A() {cout << "DTOR of A" << endl;}
A (const A &) {cout << "Cctor of A" << endl;}
A& operator =(const A& other) {/* some code */}
};

class B : public A
{
/* B's data members and methods */
};

int main()
{
/* code */
return 0;
}

class B 不会继承所有四个,但为什么呢?对于构造函数 - 我认为如果 B 会继承 A 的构造函数,那么代替创建一个更大的对象(B 对象,因为 B 继承自 A,那么它将是一个更大的对象)我们创建一个更小的对象,没有B 的方法和数据成员。我是对还是错?

析构函数、复制构造函数和赋值运算符呢?上述原因(假设是正确的)是否也适用于他们?

问候罗恩

最佳答案

多重继承是您不继承构造函数的原因之一。复制构造函数在这方面并不特殊。

struct B1 {
virtual ~B1() {}
B1(int a);
};

struct B2 {
virtual ~B2() {}
B2(int a);
};

struct D : public B1, public B2 {
};

目前尚不清楚哪种方法适合这种情况。

我个人认为,通过不继承它们,实现意图会更加清晰,尽管这可能不是语言设计者会声明的原因。

如果您打算继承它,您可以而且总是应该定义一个析构函数 virtual。

class A {
public:
virtual ~A() {cout << "DTOR of A" << endl;
};

没有虚拟你会内存泄漏。

正如其他人所指出的,赋值运算符将被继承。不过,我暗暗怀疑继承赋值运算符的用处会受到限制。

编辑:

进一步阅读,非虚拟析构函数实际上是未定义的行为。实际上,它只是表现为内存泄漏。

关于c++ - 我们不能从基类 : why? 继承什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7208810/

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