簡體   English   中英

C ++從超類調用子類方法

[英]C++ Call subclass method from superclass

我有以下樣式的代碼:

class SubClass;
class SuperClass;

class SuperClass {

private:

    void bar() {

        SubClass().foo();
    }
};

class SubClass : SuperClass {

public:

    void foo() {};
};

所以基本上我有一個SuperClass,我想從中調用子類的方法foo()。 VS 2012給了我以下錯誤:

錯誤1錯誤C2514:'SubClass':類沒有構造函數。

錯誤2錯誤C2228:'。foo'的左邊必須有class / struct / union。

我想做什么的正確結構是什么?

你不能這樣做。 您必須(至少)在基類中聲明該方法。 例如:

#include <iostream>

class SuperClass 
{
public:
    void bar() 
    {
        foo();
    }
private:
    virtual void foo() // could be pure virtual, if you like
    {
        std::cout << "SuperClass::foo()" << std::endl;
    }
};

class SubClass : public SuperClass // do not forget to inherit public
{
public:
    virtual void foo() { std::cout << "SubClass::foo()" << std::endl; }
};

int main()
{
    SuperClass* pTest = new SubClass;

    pTest -> bar();

    delete pTest;
}

將打印SubClass::foo()

首先,你必須意識到調用SubClass().foo()與當前對象無關 - 它將創建一個新的SubClass對象並調用它的foo成員。 如果你想讓bar函數在當前對象上調用foo ,你需要將foo聲明為基類中的虛函數,正如Kiril建議的那樣。

但是,如果你確實想要在一個新對象上調用foo (這沒什么意義,但無論如何),你正確地做到了。 您的示例未編譯,因為SubClass是向前聲明的,但未在bar函數之前定義 - 您可能希望將bar的實現移動到SubClass的定義之下,如下所示:class SubClass; class SuperClass;

class SuperClass {

private:

    void bar();
};

class SubClass : SuperClass {

public:

    void foo() {};
};

void SuperClass::bar() {
    SubClass().foo();
}

你可以嘗試一些CRTP,即:

#include <iostream>


class SubClass;

template<typename T>
class SuperClass {
public:

    void bar() {

        ((T *) this)->foo();
    }
};

class SubClass : public SuperClass<SubClass> {

public:

    void foo() {
        std::cout << "hello crtp!" << std::endl;
    };
};

int main(void){

    SubClass a = SubClass();
    a.bar();

    return 0;
}

暫無
暫無

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

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