编译时类继承
Compile-time class inhertiance
假设给定两个类A
和B
,它们的接口事先是未知的。目标是在编译时将A
和B
一般地"组合"成一个名为AB
的新类。
通过组合,我的意思是所有成员函数和所有成员变量以及A
和B
的所有类型都以相同的实现出现在AB
中。经典的类继承是不够的;我需要在编译时使用它,因为在我的应用程序中,运行时调度的成本非常高。天真的解决方案是为每个类创建一个实例并转发任何调用;但是,这不是泛型的,因为我们假定接口没有预先固定。
如果有帮助的话,使用c++ 11的概念是可以的。A
和B
接口冲突时出现编译错误是可以接受的。
类实现基于一些外部数据的实用函数,并作为模板参数传递。有几个经常使用的典型实用程序,我想提出(类A
, B
, C
),但并非所有都适用(例如,如果只有A
和B
适用,那么我想使用实用程序AB
)。代码非常底层,实用程序函数经常在时间临界循环中调用
对于非虚函数,继承不会产生运行时开销。因此,简单地不要将A
或B
的任何成员声明为virtual
,编译器将不会创建虚函数表。
一个简单的例子是
struct A { void f() { /* ... */ } };
struct B { void g() { /* ... */ } };
struct AB : public A, public B { }; // Provides both f and g.
的被害者。,如果A
和B
重叠,编译器会报错为歧义。
(这个答案是根据评论给出的,为了完整起见;感谢评论员)
我相信这已经在其他地方解决了-您正在寻找的是静态继承。实现这一点的两种模式是基于策略的设计和奇怪的循环模板。注意重载问题。
#include <iostream>
using namespace std;
class A
{
public:
int a;
A() : a(0) {}
int foo_A() { return a; }
};
class B
{
public:
int b;
B() : b(1) {}
int foo_B() { return b; }
};
template<class stinh1, class stinh2>
class AB : public stinh1, public stinh2
{
};
int main()
{
AB<A,B> ab;
cout << ab.foo_A() << endl << ab.foo_B() << endl;
ab.a = 2;
ab.b = 3;
cout << ab.foo_A() << endl << ab.foo_B() << endl;
}
继承是一种方法(可能是更可取的方法)。如果a和B包含具有签名(相同名称和相同参数)的方法,您将遇到一个小问题,如果事先不了解API,这很难克服。您可以尝试静态分析代码,让程序将代码读取为文本,解析API并创建两个API组合的新文本,您将需要决定如何处理相同的签名问题(您调用两者吗?什么顺序?等")。这个解决方案要困难得多,也更容易出错。
- C++ 多级虚拟继承编译问题
- 编译时继承类中的隐式虚拟与显式虚拟
- 在编译时检查未实例化的类模板是否继承自其第一个模板参数
- 继承的构造函数,在 clang++3.9 中编译,在 g++ 7 中失败
- 使用多重继承时出现编译错误
- 为什么下面的代码不会编译(c++中的继承)
- 继承可以用来减少C++中编译代码的大小吗?
- C++ 上的循环依赖和继承编译错误
- 编译器无法编译继承 C++
- 如果对象是堆栈创建的(包括继承的类型),是否可以发出编译错误
- 获取多重继承中基类的编译时常量偏移量
- 可以用参数包编译C 17 lambda继承的编译器
- 为什么 Visual C++无法编译从私有嵌套类继承的友元模板
- C++中的继承和模板:为什么以下一段代码不编译?
- 继承结构的类型转换导致g++编译错误
- 继承受保护的函数和公共变量C++时发生多重继承编译错误
- 钻石继承方案在 G++ 中编译良好,但在 VC++/Eclipse 中产生警告/错误
- C++的多重继承和多重实现编译但崩溃
- 继承编译时或运行时
- 多重(菱形)继承编译而不"virtual",但不使用