簡體   English   中英

協變虛函數的C ++規則

[英]C++ rules for covariant virtual function

我正在閱讀Covariant虛擬函數 它說

假設B :: f覆蓋了虛函數A :: f。 如果滿足以下所有條件,則A :: f和B :: f的返回類型可能會有所不同:

1)B :: f返回的指針或引用的const或volatile限定與A :: f返回的指針或引用的const或volatile限定相同或更少。

2)僅當B :: f返回左值引用時,A :: f返回左值引用。

3)函數B :: f返回指向T類型的類的指針或引用,而A :: f返回指向T的明確直接或間接基類的指針或引用。

4)B :: f的返回類型必須在聲明B :: f時完整,也可以是B類型

有人會通過舉例說明上述2條規則嗎? 這兩個規則到底是什么意思?第二個規則適用於C ++ 11嗎? 以下示例滿足我在這里說的第一條規則嗎?

#include <iostream>
class Base {
    public:
        virtual const Base& fun() const
        {
            std::cout<<"fun() in Base\n";
            return *this;
        }
        virtual ~Base()
        { }
    private:
        int a=3;
};
class Derived : public Base
{
        const Derived& fun() const
        {
            std::cout<<"fun() in Derived\n";
            return *this;
        }
};
int main(){
    Base* p=new Derived();
    p->fun();
    delete p;
    return 0;
}

如果我在某處錯了,請糾正我。我對前兩個規則感到困惑。

謝謝

非常感謝您的幫助。

第一條規則意味着,如果A版本不具有constvolatileB ,則不能使覆蓋的函數返回B

struct A
{
    virtual A* foo() { return new A{}; }    
};

struct B : A
{
    B* foo() override {return new B{}; }          //valid
    const B* foo() override {return new B{}; }    //invalid
    volatile B* foo() override {return new B{}; } //invalid
};

如果考慮呼叫站點,這是有道理的:

A* my_b = new B{};
A* new_b = my_b->foo(); //discards the const qualifier if B::foo() returns const B*

第二條規則意味着您不能將完全不同的引用或指針類型作為協變返回類型。 使用與上述相同的示例:

struct A
{
    virtual A* foo() { return new A{}; }    
};

struct B : A
{
    B* foo() override {return new B{}; }   //valid
    B& foo() override {return new B{}; }   //invalid
    B&& foo() override {return new B{}; }  //invalid
};

再次考慮呼叫站點:

A* my_b = new B{};
A* new_b = my_b->foo(); //if B::foo() returns a reference, this line is syntactically ill-formed

您的示例滿足這兩個規則,因為兩種返回類型都具有相同的cv限定符,並且都是左值引用。

暫無
暫無

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

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