gpt4 book ai didi

c++ - 防止在头文件之外创建子类

转载 作者:可可西里 更新时间:2023-11-01 15:05:29 25 4
gpt4 key购买 nike

我在 .h 文件中定义了以下三个类:

class Base
{ // number of pure virtual functions };

class Derived1 : public Base
{ // number of pure virtual functions };

class Derived2 : public Base
{ // number of pure virtual functions };

我希望这个头文件的用户只继承 Derived1 或 Derived2。我想阻止用户对 Base 进行子类化。我“可以”为类 Base 使用关键字“final”,但这会阻止我在头文件中进行子类化。我需要在头文件中包含上述所有类,因为用户需要在 Base 和 DerivedX 类中提供方法定义。

我正在考虑将继承范围限制在头文件内(类似于静态变量)。任何建议或想法将不胜感激。

最佳答案

您可以将 Base 构造函数设为私有(private)并让这两个类成为 friend ,例如

#include <iostream>

class Base
{
private:
Base() {}
friend class Derived1;
friend class Derived2;
};

class Derived1 : public Base
{
};

class Derived2 : public Base
{
};

int main() {

Derived1 obj;
Base obj2; // Error

return 0;
}

http://ideone.com/NUWad0

另请注意:基类的复制/移动构造函数也应该是私有(private)的。我添加代码并不是为了专注于主要提案,但您也应该考虑一下。


关于 friend 构造函数的编辑。

首先:在编译器看到其定义之前,您不能引用不完整类型的成员(它作为一次性传递工作,并且可能涉及一些重载决议)。这意味着以下将不起作用:

class Derived1;
class Derived2;

class Base
{
private:
Base() {}
friend Derived1::Derived1(); // Error - incomplete type 'Derived1' in nested name specifier
};

class Derived1 : public Base
{
public:
Derived1() {};
};

...

而且你不能转发声明一个基类(你不知道要为派生对象分配多少空间):

class Base;

class Derived1 : public Base // Error: base class has incomplete type
{
public:
Derived1() {};
};

class Base
{
private:
Base() {}
friend Derived1::Derived1();
};

...

因此,在您的特定情况下,除非您想修改设计中的某些内容,否则您最好使用 friend 类访问权限。

关于c++ - 防止在头文件之外创建子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25449002/

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