首页 > 解决方案 > Accessing Private function using virtual function

问题描述

How to avoid The private function calling indirectly using base class virtual function.

class baseclass{
public:
    virtual void printmynumber() = 0;
};

class derivedclass : public baseclass
{
private:
    int m_mynumber;
    void printmynumber()
    {
        cout << m_mynumber << endl; 
    }
public:
    derivedclass(int n)
    {
       m_mynumber = n;
    }
};


void main()
{
    baseclass *bObj = new derivedclass(10);
    bObj->printmynumber();
    delete bObj;
}

How to avoid the calling of private function?

标签: c++oopvirtual-functionsprivate-members

解决方案


你不能用继承来做到这一点。给定一个指向 的指针baseclass,编译器只知道它有一个public virtual函数,因此允许相应地调用该函数。

派生类选择从基类继承,并实现了具有不同访问权限的功能。但这些都是不可见的,只给出了一个指向基础的指针。

没有什么可以阻止derivedclass::printmynumber()实现什么都不做 - 这意味着如果代码调用它,将不会有可观察的效果(假设没有预期的效果是可以容忍的)。

真正的解决方案是修复您的设计,而不是试图解决其中的缺陷。不要继承derivedclassbaseclass. 那样的话,根本derivedclass就不能调用 of 的成员函数,只给出指向 的指针baseclass,因为类型不相关(将 a 传递derivedclass *给期望 a 的函数baseclass *通常会被诊断为错误)。

顺便说一句: main()返回int,不是void。一些编译器支持void main()非标准扩展(并且其中一些编译器的文档错误地描述了标准这样的东西),但最好避免使用。


推荐阅读