如何使用接口指针调用方法,该指针是其具体类的一部分,而不是接口的一部分



我有一个接口Test_I,它由许多类实现,如myTest1myTest2。我有编写新类的新要求myTest3它必须是接口Test_I的子类。除了现有的方法,myTest3还有一些其他的新方法,如mySomeOtherTestFunction,它与父接口Test_I无关。我必须仅使用接口指针调用具体类的所有方法,这不能更改。如何在不将此方法添加到父接口的情况下解决此问题。

class Test_I
{
public :
virtual void myTestFunction1() = 0;
virtual void myTestFunction2() = 0;
};

class myTest1 : public Test_I
{
public : 
virtual void myTestFunction1()
{
cout<<"in myTest1::mytestFunction1"<<endl;
}
virtual void myTestFunction2()
{
cout<<"in myTest1::mytestFunction2"<<endl;
}
};

class myTest2 : public Test_I
{
public : 
virtual void myTestFunction1()
{
cout<<"in myTest2::myTestFunction1"<<endl;
}
virtual void myTestFunction2()
{
cout<<"in myTest2::myTestFunction2"<<endl;
}
};

class myTest3 : public Test_I
{
public : 
virtual void myTestFunction1()
{
cout<<"in myTest3::myTestFunction1"<<endl;
}
virtual void myTestFunction2()
{
cout<<"in myTest3::myTestFunction2"<<endl;
}
//I need one more method here, which is specific to myTest3 class and not related to interface Test_I
virtual void mySomeOtherTestFunction()
{
cout<<"in myTest3::mySomeOtherTestFunction"<<endl;
}
};

int _tmain(int argc, _TCHAR* argv[])
{
myTest1 t1;
myTest2 t2;
myTest3 t3;
Test_I *pTest = &t1;    
pTest->myTestFunction1();
pTest->myTestFunction2();
pTest = &t2;
pTest->myTestFunction1();
pTest->myTestFunction2();
pTest = &t3;
pTest->myTestFunction1();
pTest->myTestFunction2();
pTest->mySomeOtherTestFunction(); //This will fail with error : 'mySomeOtherTestFunction' : is not a member of 'Test_I'
return 0;
}

你必须向下投射指针:

#include <iostream>
using std::cout;
class Test_I
{
public :
virtual void myTestFunction1() = 0;
virtual void myTestFunction2() = 0;
};

class myTest1 : public Test_I
{
public : 
void myTestFunction1() override
{
cout<<"in myTest1::mytestFunction1n";
}
void myTestFunction2() override
{
cout<<"in myTest1::mytestFunction2n";
}
};

class myTest2 : public Test_I
{
public : 
void myTestFunction1() override
{
cout<<"in myTest2::myTestFunction1n";
}
void myTestFunction2() override
{
cout<<"in myTest2::myTestFunction2n";
}
};

class myTest3 : public Test_I
{
public : 
void myTestFunction1() override
{
cout<<"in myTest3::myTestFunction1n";
}
void myTestFunction2() override
{
cout<<"in myTest3::myTestFunction2n";
}
virtual void mySomeOtherTestFunction()
{
cout<<"in myTest3::mySomeOtherTestFunctionn";
}
};

int main()
{
myTest1 t1;
myTest2 t2;
myTest3 t3;
Test_I *pTest = &t1;    
pTest->myTestFunction1();
pTest->myTestFunction2();
pTest = &t2;
pTest->myTestFunction1();
pTest->myTestFunction2();
pTest = &t3;
pTest->myTestFunction1();
pTest->myTestFunction2();
// if cast fails, returns nullptr
myTest3 *newPTest = dynamic_cast<myTest3 *>(pTest);
if (newPTest != nullptr) {
newPTest->mySomeOtherTestFunction();
}
// cast without check, undefined behavior if Test_I is not a base class of myTest3
static_cast<myTest3 *>(pTest)->mySomeOtherTestFunction();
return 0;
}

如果要使用运行时类型信息 (RTTI( 检查是否可以进行转换,或者static_cast确定此强制转换是可能的,请使用dynamic_cast

最新更新