C++虚函数(9) - 虚函数能否为private

C++中,虚函数可以为private,并且可以被子类覆盖。

例如,下面程序工作正常。

#include<iostream>

class Base {
private:
    virtual void fun() { std::cout << "Base Fun" << std::endl; }
    friend int main();
};

class Derived : public Base {
public:
    void fun() { std::cout << "Derived Fun" << std::endl; }
};

int main() {
    Base* ptr = new Derived;
    ptr->fun();
    return 0;
}

运行结果:
Derived fun()

对于上面的程序,有下面几点是需要注意的方面:
1) ptr是一个Base类型的指针,指向的是Derived对象。最终实际调用的是Derived::fun()。

2) int main()是Base类的友元函数。如果删除这个友元声明,则程序会编译失败。因为在编译期间,会进行权限检查。对于这行代码ptr->fun(), 编译器会检查到fun是私有函数,base类型的对象/指针无权访问。

这种行为与Java完全不同。在Java中,私有方法默认是final的,不能被覆盖。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C++中,虚函数和纯虚函数都是用来实现多态性的特性。虚函数是在基类中声明虚函数的成员函数,它可以被派生类重写,从而实现运行时多态。而纯虚函数是在基类中声明为纯虚函数虚函数,它没有函数体,需要在派生类中重写实现,从而实现接口的统一。 具体而言,虚函数在基类中使用virtual关键字进行声明,派生类可以通过override关键字重写该虚函数。例如: ```c++ class Animal { public: virtual void makeSound() { std::cout << "Animal makes a sound." << std::endl; } }; class Dog : public Animal { public: void makeSound() override { std::cout << "Woof!" << std::endl; } }; int main() { Animal *animal = new Dog(); animal->makeSound(); delete animal; return 0; } ``` 在这个例子中,Animal类中的makeSound()函数被声明虚函数,并且在Dog类中被重写。在main函数中,创建了一个Dog对象并将其赋值给Animal指针,然后调用了makeSound()函数,此时会调用Dog类中的makeSound()函数,因为它已经重写了Animal类中的makeSound()函数。 而纯虚函数在基类中使用virtual关键字和=0进行声明,子类必须实现该函数。例如: ```c++ class Shape { public: virtual double getArea() const = 0; }; class Square : public Shape { public: double getArea() const override { return width * width; } private: double width; }; int main() { Shape *shape = new Square(5); std::cout << "Area of square: " << shape->getArea() << std::endl; delete shape; return 0; } ``` 在这个例子中,Shape类中的getArea()函数被声明为纯虚函数,并且在Square类中被实现。在main函数中,创建了一个Square对象并将其赋值给Shape指针,然后调用了getArea()函数,此时会调用Square类中的getArea()函数,因为它已经实现了Shape类中的纯虚函数
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值