我已经声明了以下抽象接口类,它只有一个函数:
class IAuthenticator
{
public:
virtual void CreateJson() = 0;
};
在我创建更多类'UIData'并从接口类继承之后,在这种情况下:
class UIData : public IAuthenticator
{
protected:
UIData() : mWindowHandle(0)
{ /* Constructor do nothing. **/ }
private:
integer mWindowHandle;
public:
void CreateJson()
{
std::cout<<"UIData::CreateJson\n";
}
};
我还有一个继承自UIData
class AuthenticateIn : public UIData
{
private:
string mOrigin;
string mLogoURL;
string mUserID;
public:
void CreateJson()
{
std::cout<<"AuthenticateIn::CreateJson\n";
}
};
在我的main函数中,我编写了这样的代码。
int main()
{
AuthenticateIn* ai = new AuthenticateIn();
ai->CreateJson();
}
当我调用CreateJson()
函数时,我会看到log "AuthenticateIn::CreateJson"
。我想找到一种方法来调用CreateJson()
,它将被调用所有基类。
我知道我可以从this->UIData::CreateJson()
类AuthenticateIn
函数调用CreateJson
,但有没有其他方法可以做到这一点,一些自动方式?谢谢!!
答案 0 :(得分:3)
有没有其他方法可以做到这一点,一些自动方式
不,没有。您必须从派生类调用基类的实现。编译器不会自动执行此操作,因为它不知道您实际上是否想要这个。
答案 1 :(得分:1)
您必须在派生类中调用基类函数,如下所示:
void CreateJson() {
UIData::CreateJSon();
}
等
答案 2 :(得分:0)
不,没有这样的方法。如果要从基类调用虚函数,则应直接执行此操作。
答案 3 :(得分:0)
您可能无法强制调用虚拟基类,但可以使用间接模拟行为。
typedef int integer;
#include <iostream>
#include <string>
using std::string;
using std::cout;
class IAuthenticator
{
public:
virtual void CreateJson() = 0;
};
class UIData : public IAuthenticator
{
protected:
UIData() : mWindowHandle(0)
{ /* Constructor do nothing. **/ }
private:
integer mWindowHandle;
virtual void CreateJsonPrivate() = 0;
public:
void CreateJson()
{
CreateJsonPrivate();
std::cout<<"UIData::CreateJson\n";
}
};
class AuthenticateIn : public UIData
{
private:
string mOrigin;
string mLogoURL;
string mUserID;
virtual void CreateJsonPrivate()
{
std::cout<<"AuthenticateIn::CreateJson\n";
}
};
int main()
{
AuthenticateIn* ai = new AuthenticateIn();
ai->CreateJson();
}
输出:
AuthenticateIn::CreateJson
UIData::CreateJson