【C++】多态问题:基类调用子类的protected或者private函数
生活随笔
收集整理的這篇文章主要介紹了
【C++】多态问题:基类调用子类的protected或者private函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、問題描述
如果在基類中虛函數是public,子類中重載時標記為protected或者private函數,是否還能訪問這個函數?
答案是:
基類指針指向子類時,可以訪問,并且訪問的是子類重載后的函數;
子類指針肯定不能訪問,直接受protected、private限制。
下面測試代碼演示了上面的結論,并且順便演示了一下,基類或子類如何訪問基類的虛函數。
2、測試代碼
#include <QCoreApplication>
#include <QDebug>class BaseClass{
public:BaseClass(){ qDebug() << "BaseClass constructor"; }virtual ~BaseClass() ;virtual void publicFun() { qDebug() << "BaseClass publicFun"; }virtual void basePublic_SubProtectedFun() { qDebug() << "BaseClass basePublic_SubProtectedFun"; }virtual void basePublic_SubPrivateFun() { qDebug() << "BaseClass basePublic_SubPrivateFun"; }protected:virtual void protectedFun() { qDebug() << "BaseClass protectedFun"; }private:virtual void privateFun() { qDebug() << "BaseClass privateFun"; }
};BaseClass::~BaseClass()
{qDebug() << "BaseClass destructor";
}class SubClass : public BaseClass{
public:SubClass(){ qDebug() << "SubClass constructor"; }virtual ~SubClass() ;virtual void publicFun() { qDebug() << "SubClass publicFun"; }protected:void protectedFun() { qDebug() << "SubClass protectedFun"; }void basePublic_SubProtectedFun() { qDebug() << "SubClass basePublic_SubProtectedFun"; }private:void privateFun() { qDebug() << "SubClass privateFun"; }void basePublic_SubPrivateFun() { qDebug() << "SubClass basePublic_SubPrivateFun"; }
};SubClass::~SubClass()
{qDebug() << "SubClass destructor";
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);qDebug() << "多態:基類指針指向子類,可以調用子類的保護或者私有函數";BaseClass *baseSub = new SubClass;baseSub->publicFun();baseSub->BaseClass::publicFun();baseSub->basePublic_SubProtectedFun(); //在基類中是public,所以可以調用,并且調用的是子類的protectedbaseSub->BaseClass::basePublic_SubProtectedFun(); //在基類中是public,所以可以調用,并且調用的是子類的protectedbaseSub->basePublic_SubPrivateFun();baseSub->BaseClass::basePublic_SubPrivateFun();delete baseSub;SubClass *sub = new SubClass;sub->publicFun();sub->BaseClass::publicFun();// sub->basePublic_SubProtectedFun(); //因為是保護成員函數,所以不能調用sub->BaseClass::basePublic_SubPrivateFun();// sub->basePublic_SubPrivateFun(); //因為是私有成員函數,所以不能調用sub->BaseClass::basePublic_SubProtectedFun();delete sub;return a.exec();
}
打印輸出
BaseClass constructor
SubClass constructorSubClass publicFun
BaseClass publicFunSubClass basePublic_SubProtectedFun
BaseClass basePublic_SubProtectedFunSubClass basePublic_SubPrivateFun
BaseClass basePublic_SubPrivateFunSubClass destructor
BaseClass destructorBaseClass constructor
SubClass constructorSubClass publicFun
BaseClass publicFunBaseClass basePublic_SubPrivateFun
BaseClass basePublic_SubProtectedFunSubClass destructor
BaseClass destructor
總結
以上是生活随笔為你收集整理的【C++】多态问题:基类调用子类的protected或者private函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Live555】liveMedia下载
- 下一篇: 【Live555】live555源码详解