存储抽象成员,保持接口简单
store abstract member, keep interface simple
我知道它是不可能有一个抽象类的实例作为另一个类的基成员,即
#include <iostream>
class Base {
public:
Base() {};
virtual ~Base() {};
virtual int yield() = 0;
};
class C1: public Base {
public:
C1(): Base() {};
virtual ~C1() {};
virtual int yield() {return 1;};
};
class D {
public:
D(Base & b): b_(b) {};
virtual ~D() {};
private:
Base b_;
}
int main() {
C1 c;
D d(c);
}
将编译失败,并出现错误
test.cpp:22:10: error: cannot declare field ‘D::b_’ to be of abstract type ‘Base’
显而易见的解决方法是使用(共享)指针。然而,这使得main
的读取更加复杂,
int main() {
auto c = std::make_shared<C1>();
D d(c);
}
我真的很想避免。
是否有一种方法可以保持main
文件像上面的示例一样简单,并且仍然实现所需的功能?
你不能。当您创建D
时,它为B
分配(在堆或堆栈中)内存。C1
类需要基类B
的大小加上C1
本身的额外变量/等的大小,即使没有新的。
virtual int yield() = 0;
导致的错误。如果您使用virtual int yield()
,它将工作。当您使用virtual int yield() = 0;
时,它说该函数是pure virtual
函数,因此您必须override
它。所以你应该给它inheritance class
,在class C1
中使用the instance of inheritance class
。在一个世界里,virtual int yield() = 0;
只是提醒你它只是一个接口,你必须覆盖它。我希望这对你有帮助。
因为Base是一个抽象类(至少有一个纯虚函数),所以不能直接实例化它。当您将D的类成员声明为"Base b_"时,您实际上是在尝试创建一个实例。你可以在这里使用指针(或者某种安全/智能指针)。
#include <iostream>
class Base {
public:
Base() {};
virtual ~Base() {};
virtual int yield() = 0;
};
class C1: public Base {
public:
C1(): Base() {};
virtual ~C1() {};
virtual int yield() {return 1;};
};
class D {
public:
D(Base * b): b_(b) {};
virtual ~D() {};
private:
Base *b_; // Use a pointer or safe ptr or something of that sort.
}
int main() {
C1 c;
D d(&c);
}
No。抽象类的一个属性是它不能被实例化。这意味着抽象类的实例不能是另一个类的成员。
即使Base
不是抽象的,类D
的构造函数也会对传递的对象进行切片。如果传递一个C1
的实例,复制(在D
的构造函数的初始化列表中)不会神奇地导致D
的实例包含一个C
类型的对象。相反,它只会创建该对象的Base
部分的副本。
简而言之,你的设计是坏的,即使在语法上可以简化main()
中的代码,也不能工作。
- 在c++中用vector填充一个简单的动态数组
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的简单if-else语句是如何无法访问的代码
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 一种在C++中读取TXT配置文件的简单方法
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Visual C++GC接口如何启用它以及要包含哪个库
- 关于简单C++函数(is_palindrome)的逻辑的问题
- Windows.h与GLFW.h的接口
- 显示错误输出的简单数组排序程序
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 退出简单while循环时出现问题
- 为什么简单的算术减法在"if"条件下不起作用?
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 提供与TMP和SFINAE的通用接口
- 在自定义 C/C++ 程序中获取 PPP0 接口 Tx/Rx 字节的最简单方法是什么?
- swig:接口简单的C 类,返回向量
- 如何为一个简单的转换例程设计一个接口
- 存储抽象成员,保持接口简单