【问题标题】:Only declaring a default constructor in C++仅在 C++ 中声明默认构造函数
【发布时间】:2014-02-14 16:32:38
【问题描述】:

我想知道我是否只在派生类中声明(而不是定义)默认构造函数,为什么在创建派生类的对象时不调用基类构造函数?

仅声明默认构造函数也是一种常见的做法吗?如果是,它们的优点是什么?

class A
{
  private:
  A() {}
}

class B : public A
{
  B();
}

不会给出编译错误,但是

class B : public A
{ 
  B() {}
}

给出错误:- 在构造函数 B::B() 中:错误:A::A() 是私有的。

这样做的理由是什么?

【问题讨论】:

标签: c++ constructor


【解决方案1】:
class B : public A
{
  B();
}

在这种情况下,编译器接受这一点,因为您可以使用 A 的任何公共或受保护构造函数来实现 B()。它不是实现,所以此时您没有使用 A()。

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

这里你隐式使用了空的 A 构造函数,它被声明为私有的,所以是非法的。

将所有构造函数声明为私有不允许派生。我想它在某些情况下对某人有用

【讨论】:

  • 但是我的代码没有任何 A 的公共/受保护的构造函数。这是否意味着我不能创建 B 类的对象?
  • 您的代码甚至不允许您实例化 A 对象。没有公共构造函数,也没有静态工厂函数。但是您仍然可以派生 A 并访问公共和受保护的静态成员(如果有)。
【解决方案2】:

你能举个例子吗?如果您确实声明但未定义构造函数,则代码编译并运行似乎很奇怪。您应该对派生构造函数有一个未定义的引用。

通常你只会声明而不是定义一个你想阻止被使用的成员函数。例如,您可以声明而不定义复制构造函数(私下)以防止对象被复制。这里的“预防”其实是通过一个未定义的引用编译错误来实现的。

【讨论】:

  • base *b = new base(); ((derived*)b)->some_fn_of_derived(); 将在 derivedctor 已声明但未定义时编译并运行。我并不是说它是安全的或“最佳实践”,但 C/C++ 将允许您做很多并非真正“自”以来的事情(尽管一旦您使用该语言更多地了解它为什么以及如何“可以' 有用)...
  • 它不运行。它不链接。它通过了编译。
猜你喜欢
  • 2012-07-19
  • 2014-07-05
  • 2020-11-25
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
相关资源
最近更新 更多