[英]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.