Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们不能从基类继承什么:为什么? 我的第一个C++课程结束后,我有一些问题想澄清一下。_C++_Inheritance - Fatal编程技术网

我们不能从基类继承什么:为什么? 我的第一个C++课程结束后,我有一些问题想澄清一下。

我们不能从基类继承什么:为什么? 我的第一个C++课程结束后,我有一些问题想澄清一下。,c++,inheritance,C++,Inheritance,我们无法继承以下内容(C++标准不允许): 构造函数、复制构造函数、赋值运算符和析构函数。 因此,如果我们有: #include <iostream> using namespace std; class A { public: A() {cout << "CTOR of A" << endl;} ~A() {cout << "DTOR of A" << endl

我们无法继承以下内容(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;
    }
#包括
使用名称空间std;
甲级
{
公众:

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

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

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

struct D : public B1, public B2 {
};
目前还不清楚在这种情况下,哪一个是合适的

我个人认为,实现意图更为明确,因为没有继承它们,尽管这可能不是语言设计者会陈述的理由

如果要从虚拟析构函数继承,则可以而且应该始终定义虚拟析构函数

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

virtual~A(){cout构造函数不是继承的。其他的都是继承的。这样想:继承是聚合的一种特殊情况。例如,您的示例等于

class A
{
...
}

class B
{
public:
  A a;
}

这里,
A
保留了它的所有属性,但它不为B提供构造函数。当您进行继承时,也会发生同样的情况,希望您不需要指定
A
来处理
A

的内容。这样想:B是A的一种特殊类型(B不完全是A)因此,B可能有更多的数据成员,这也需要创建/销毁。使用a的ctor、dtor等是不可能的。或者,即使B没有更多的数据成员,它也可能以不同的方式进行构建/销毁


派生类是基类的专门版本,因此需要它们自己的ctor/dtor。

您继承了赋值运算符,或者您提出了一些不同的问题。请将它们作为不同的问题提问。您继承了赋值运算符,但子类也有自己的赋值运算符。因此,名称查找的标准规则这意味着您总是找到派生类版本而不是基类版本。作为一个模糊无关的注释,friends也不会被继承。在某种程度上,您也会继承构造函数。例如:
class B:public a{B(){do_something();};
构造函数
B::B()
将调用
a::a()
即使您没有告诉它这样做。我不是指虚拟析构函数,我对这个概念没有任何问题(即用于防止内存泄漏的虚拟析构函数).我的意思是,如果我们有两个类A和B,那么B将继承B的dtor…这当然是不可能的。我只是不知道确切的原因…谢谢:)@Ron_s你是说“那么A将继承B的dtor”?@Ron_s相同的概念适用于构造函数。使用多重继承,dtor将是不明确的。是的,当然。我很抱歉。编辑:a将继承B的析构函数,即:类a:公共B{/*代码*/}