📜  虚拟函数可以在C++中私有吗?(1)

📅  最后修改于: 2023-12-03 14:57:18.783000             🧑  作者: Mango

C++中虚函数可以私有吗?

在C++中,虚函数是用于实现多态性的重要机制之一。在基类中定义虚函数后,子类可以覆盖该函数以实现特定的行为。通常情况下,虚函数都是公有的,以便它们可以在子类中被使用。

但是,是否可以将虚函数定义为私有的呢?在理论上,是可能的。下面是一个例子:

class BaseClass {
private:
    virtual void myFunction() {
        // 空函数
    }
};

int main() {
    BaseClass obj; // 错误:'BaseClass'类的对象无法访问私有函数'myFunction'
    return 0;
}

上面的代码中,myFunction() 被定义为私有虚函数,它将不存在于对象的公共接口中。因此,尝试创建该类的对象将导致编译错误。

虚函数使用多态性,主要是通过指针和引用来访问对象。因此,即使该函数是私有的,仍然可以通过公共成员函数来访问它。下面是一个示例:

class BaseClass {
private:
    virtual void myFunction() {
        cout << "这是私有虚函数" << endl;
    }
public:
    void doSomething() {
        this->myFunction();
    }
};

class SubClass : public BaseClass {
public:
    virtual void myFunction() {
        cout << "这是子类的函数" << endl;
    }
};

int main() {
    SubClass obj;
    obj.doSomething(); // 输出 "这是子类的函数"
    return 0;
}

在上面的代码中,BaseClass 中的 myFunction() 是私有的,但在 doSomething() 中,完全可以访问它。当 doSomething() 被调用时,实际上会调用 SubClass 中的 myFunction() 函数,因为 SubClass 覆盖了 BaseClass 中的 myFunction()

总结:虽然C++中可以将虚函数定义为私有的,但这通常不是个好主意。因为私有的虚函数无法直接访问,只能通过公共成员函数来访问,而且不能在子类中覆盖虚函数。建议的做法是将虚函数定义为公共的或受保护的。