gpt4 book ai didi

c++ - 防止 C++ 中的类继承

转载 作者:IT老高 更新时间:2023-10-28 13:23:39 25 4
gpt4 key购买 nike

最近我的一位 friend 问我如何防止 C++ 中的类继承。他希望编译失败。

我想了想,找到了 3 个答案。不知道哪个是最好的。

1) 私有(private)构造函数

class CBase
{

public:

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

private:

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


};

2) 使用 CSealed 基类、私有(private) ctor 和虚拟继承

class CSealed
{

private:

CSealed() {
}

friend class CBase;
};


class CBase : virtual CSealed
{

public:

CBase() {
}

};

3) 使用 CSealed 基类、 protected ctor 和虚拟继承

class CSealed
{

protected:

CSealed() {
}

};

class CBase : virtual CSealed
{

public:

CBase() {
}

};

以上所有方法确保CBase类不能被进一步继承。我的问题是:

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

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

PS:

上述程序是在 MS C++ 编译器 (Visual Studio) 中编译的。引用:http://www.codeguru.com/forum/archive/index.php/t-321146.html

最佳答案

从 C++11 开始,您可以在类中添加 final 关键字,例如

class CBase final
{
...

我想这样做的主要原因(以及我来寻找这个问题的原因)是将一个类标记为不可子类化,这样您就可以安全地使用非虚拟析构函数并完全避免使用 vtable。

关于c++ - 防止 C++ 中的类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2184133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com