簡體   English   中英

使用受保護的繼承公開基類轉換函數

[英]Making Base Class Conversion Functions Public with a Protected Inheritance

我有一個繼承自另一個的類。 我不希望這個類的用戶不小心在子對象上使用基類函數。 顯而易見的答案是使繼承受保護或私有。

但是,我確實希望從子對象隱式轉換到基類。 此強制轉換的默認實現在大多數上下文中是隱藏的,因為它被賦予了受保護/私有狀態,並且嘗試定義用戶轉換會拋出警告"converting 'B' to a reference to a base class 'A' will never use a type conversion operator [-Wclass-conversion]"

很公平。 由於這條大道對我關閉,我必須轉過來問:有什么方法可以將默認類型轉換重新分類為公共空間,以便隱式轉換可以繼續存在?

作為我試圖開始工作的一個例子:

class A
{
public:
    A()
    {
        
    }
    A(A& otherA)
    {
        
    }
};

class B : protected A
{
public:
    operator A& ()
    {
        return *this;
    }
    
};

int main() {
    B guy;
    A otherguy(guy);
}

遺憾的是,我不能僅僅將基類中的違規函數聲明為受保護的:如果用戶顯式轉換為該基類,我希望它們可用。 在我的特定情況下,B 不包含任何數據,只是 A 的方便/安全包裝器,因此我不需要擔心通過允許此轉換來切片或以其他方式丟失任何信息。 我只是不希望用戶將后端 API(當前通過公共繼承公開)誤認為是更用戶友好的包裝器 API 的一部分。

我不認為你可以按照你要求的方式做你想做的事

我會使用封裝而不是繼承:

class A {
public:
    T func1(); // should be visible via B
    void func2(); // should not be visible via B
};

class B { // note: not inheriting from A
    A base; // B explicitly defines its "base class sub-object"
public:
    // provide access to base class sub-object
    operator A&() { return base; }

    // provide access to func1
    T func1() { return base.func1(); }
};

void use(A &a) { a.func2(); }

int main() { 
    B b;

    b.func1(); // no problem
    // b.func2(); // won't work;

    use(b);    // no problem. Uses our conversion operator
}

暫無
暫無

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

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