【问题标题】:C++ call constructor in class A from class C (inherritence)C++ 从类 C 调用类 A 中的构造函数(继承)
【发布时间】:2013-11-26 20:19:53
【问题描述】:

经过一段时间的摆弄并完成了“通过游戏编程的 c++”一书,我被我正在编写的程序所困扰。

情况如下:

Class A
{
 public:
  A(int x)

 protected:
  int a;

};

A::A(int x):
 a(x)
{}

Class B : public A

Class C : public B
{
 public:
  C(int x)
};

C::C(int x)
{
  A(int x);
}

我可以在C类的构造函数中调用A类的构造函数吗?

据我所知:B 与 A 相关联,C 与 B 相关联,因此当我能够通过派生访问成员变量和函数时,我应该能够从 C 访问类 A 的构造函数。

【问题讨论】:

  • 无论如何,这不是真正的代码。它不会编译。不要忘记A::A() 需要一个参数。
  • 在这种情况下,我会说你应该试试看。 clang 和 g++ 中的编译器错误消息非常有用。
  • @JensAckou:也许我误解了你的问题。本质上:不,不可能在构造对象之后调用对象的构造函数(并且在进入 C 的 ctor 的主体之前构造 A)。但如果你告诉我们,为什么要调用基类的构造函数,或许我们可以为你提供另一种解决方案。
  • 好的,只是我认为直接调用基类的ctor而不是actor的没有优势。如果你创建一个actor 对象,你也需要用一个名字来初始化它。所以无论如何你必须为actor 写一个合适的ctor。我只想说,remyabel 的解决方案是最干净的方法,即使 C++ 允许直接调用 BC 的 ctor。

标签: c++ constructor multiple-inheritance


【解决方案1】:

你可以试试这个:

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

class C : public B
{
public:
    C(int x) : B(x) { }
};

或者如果你很懒(并且使用C++11):

class B : public A
{
public:
    using A::A(int);
};

class C : public B
{
public:
    using B::B(int);
};

这行不通:

class C : public B
{
public:
    C(int x) : A(x) { }
};

main.cpp: In constructor ‘C::C(int)’:

main.cpp:23:16: error: type ‘A’ is not a direct base of ‘C’

     C(int x) : A(x) { }

                ^

main.cpp:23:19: error: use of deleted function ‘B::B()’

     C(int x) : A(x) { }

【讨论】:

  • 因此,如果我做对了,我必须在 B 中跳转以进入 A,并且不可能简单地从 C 中调用 A 的构造函数,因为这些类彼此之间没有直接关系。
  • 因为如果我从 C 实例化一个对象,我知道 A 的构造函数会被自动调用,这让我很困扰,我需要在 A 和 C 之间的类中编写所有这些代码。
  • @Jens 我知道cplusplus.com 不是一个好的来源,但它似乎与您的problem 几乎相同。
  • 你能给我一些关于你所指的线程或链接的更多信息吗?
  • @Jens 我似乎无法在标准中找到相关部分,所以我将进行(可能不正确)猜测。 B 隐式调用A 的构造函数,而您尝试在C 中再次调用它,这将不起作用。但是,如果B 没有什么重要的,那么您可能会直接从A 继承。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多