簡體   English   中英

編譯時類繼承

[英]Compile-time class inhertiance

假設給了兩個類AB ,它們的接口事先未知。 目的是在編譯時AB通用地“組合”到一個稱為AB的新類中。

通過組合,我的意思是所有具有相同實現的成員函數和所有成員變量以及AB所有類型都存在於AB 經典的類繼承是不夠的。 我需要在編譯時使用它,因為在我的應用程序中運行時分派成本很高。 天真的解決方案是為每個類創建一個實例並轉發任何調用。 但是,這不是通用的,因為我們假定接口不會預先固定。

如果有幫助,使用概念C ++ 11很好。 如果AB的接口發生沖突,則可以接受編譯器錯誤。

背景

這些類實現基於某些外部數據並作為模板參數傳遞的實用程序函數。 有幾種典型的實用程序經常使用,我想將其排除在外(類ABC ),但並非總是適用的(例如,如果僅AB適用,那么我想使用實用程序AB )。 該代碼是非常低的水平和效用函數被調用往往一個時間關鍵循環中。

對於非虛擬函數,繼承不會導致運行時開銷。 因此,只需不要AB任何成員聲明為virtual成員,編譯器就不會創建任何vtable。

一個簡單的例子是

struct A { void f() { /* ... */ } };
struct B { void g() { /* ... */ } };

struct AB : public A, public B { };  // Provides both f and g.

Nb,如果AB重疊,則編譯器將抱怨模棱兩可。

(此答案基於評論,出於完整性考慮而給出;應歸功於評論者。)

我確信這已經在其他地方解決了-您正在尋找的是靜態繼承。 實現此目的的兩種模式是基於策略的設計和奇怪的重復模板。 當心超載問題。

#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來創建新文本,您將需要決定如何處理相同的簽名問題(兩者都調用嗎?以什么順序?等等”)。 這種解決方案要困難得多,而且容易出錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM