相关疑难解决方法(0)

调用超类构造函数的规则是什么?

从子类1调用超类构造函数的C++规则是什么?

例如,我知道在Java中,你必须将它作为子类构造函数的第一行(如果不这样做,则假定对no-arg超级构造函数的隐式调用 - 如果缺少则会给出编译错误) .

c++ inheritance constructor

650
推荐指数
10
解决办法
76万
查看次数

继承构造函数

为什么这段代码:

class A
{
    public: 
        explicit A(int x) {}
};

class B: public A
{
};

int main(void)
{
    B *b = new B(5);
    delete b;
}
Run Code Online (Sandbox Code Playgroud)

导致这些错误:

main.cpp: In function ‘int main()’:
main.cpp:13: error: no matching function for call to ‘B::B(int)’
main.cpp:8: note: candidates are: B::B()
main.cpp:8: note:                 B::B(const B&)

B不应该继承A的构造函数吗?

(这是使用gcc)

c++ inheritance gcc constructor

199
推荐指数
5
解决办法
19万
查看次数

为什么要在C++中为抽象类声明虚拟析构函数?

我知道在C++中为基类声明虚拟析构函数是一个好习惯,但是virtual即使对于作为接口的抽象类来说,声明析构函数总是很重要吗?请提供一些理由和示例原因.

c++ inheritance virtual-destructor

159
推荐指数
6
解决办法
7万
查看次数

C++构造函数/析构函数继承

编辑:答案摘要

在下文中,B是A的子类.

这是一个术语问题; ctors和dtor 不是继承的,因为B的ctor/dtor 不会从A的界面借用.一个类至少有一个构造函数,并且只有一个析构函数.

  • 建设者:
    • B不从A继承构造函数;
    • 除非B的ctor明确地调用A的一个 ctor,否则A的默认ctor将 B的ctor主体之前自动调用(这个想法是A需要在B创建之前初始化).
  • 破坏者:
    • B不继承A的dtor;
    • 退出,B的析构函数会自动调用的析构函数.

致谢: 我特别感谢Oli Charlesworth和Kos的答案,我将Kos的答案作为解决方案,因为这是我最了解的答案.


原始邮政

当您在Google上搜索"C++析构函数继承站点:stackoverflow.com"时,您当前会发现以下帖子:

  1. 构造函数和析构函数继承:具有30k +声誉的两个用户说它是继承的,并且它不是
  2. 虚拟析构函数是继承的吗?:这里没有提到会指向析构函数不被继承的东西
  3. C++中的析构函数和继承?:评论似乎表明析构函数是继承的

Q1:我从实践中也知道的是,你不能使用与它的父构造函数相同的原型初始化派生对象而没有明确地定义派生类的构造函数,这是正确的吗?


尽管从帖子中可以清楚地看出析构函数似乎是继承的,但我仍然感到困惑的是,拥有32k声望的用户会说它不是.我写了一个小例子,应该澄清每个人的想法:

#include <cstdio>

/******************************/

// Base class
struct A
{
    A() { printf( "\tInstance counter = %d (ctor)\n", ++instance_counter ); }
    ~A() { printf( "\tInstance counter = %d (dtor)\n", --instance_counter ); }

    static int instance_counter;
};

// Inherited class with default ctor/dtor
class …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance constructor destructor

58
推荐指数
3
解决办法
7万
查看次数