相关疑难解决方法(0)

为什么要明确删除构造函数?

何时/为什么我要显式删除我的构造函数?假设原因是为了防止其使用,为什么不做到呢private

class Foo
{ 
  public: 
    Foo() = delete; 
};
Run Code Online (Sandbox Code Playgroud)

谢谢!

c++

83
推荐指数
2
解决办法
5万
查看次数

在C++中防止类继承

最近我的一位朋友问我如何在C++中阻止类继承.他希望编译失败.

我在考虑它并找到了3个答案.不确定哪个是最好的.

1)私人建设者

class CBase
{

public:

 static CBase* CreateInstance() 
 { 
  CBase* b1 = new CBase();
  return b1;
 }

private:

 CBase() { }
 CBase(CBase3) { }
 CBase& operator=(CBase&) { }


};
Run Code Online (Sandbox Code Playgroud)

2)使用CSealed基类,私有ctor和虚拟继承

class CSealed
{

private:

 CSealed() {
 }

 friend class CBase;
};


class CBase : virtual CSealed
{

public:

 CBase() {
 }

};
Run Code Online (Sandbox Code Playgroud)

3)使用CSealed基类,受保护的ctor和虚拟继承

class CSealed
{

protected:

 CSealed() {
 }

};

class CBase : virtual CSealed
{

public:

 CBase() {
 }

};
Run Code Online (Sandbox Code Playgroud)

以上所有方法都确保不能继承CBase类.我的问题是:

1)哪种方法最好?还有其他方法吗?

2)除非CSealed类是虚拟继承的,否则方法2和3将不起作用.这是为什么 ?它与vdisp ptr有什么关系吗?

PS: …

c++ inheritance controls

56
推荐指数
4
解决办法
4万
查看次数

如何删除默认构造函数?

有时我不想提供默认构造函数,也不希望编译器为我的类提供系统默认构造函数.在C++ 11中,我可以这样做:

class MyClass 
{ 
  public: 
    MyClass() = delete; 
};
Run Code Online (Sandbox Code Playgroud)

但目前我的讲师不允许我在我的任务中这样做.问题是:在C++ 11之前,有没有办法告诉编译器隐式提供默认构造函数?

c++

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

标签 统计

c++ ×3

controls ×1

inheritance ×1