📅  最后修改于: 2023-12-03 15:14:02.037000             🧑  作者: Mango
在C++中,友元函数和虚函数都是用来访问类中私有属性和方法的方式之一。它们有着不同的用途和实现方式。
友元函数是一种函数,能够访问一个类中的私有(private)变量和函数,它的声明应该出现在类的定义中,并在类外进行定义。由于友元函数不是类的成员函数,所以它没有this指针,不能访问类的非静态成员,只能访问类的静态成员。
class MyClass {
private:
int num;
public:
friend void friendFunction(MyClass &obj) {
obj.num = 42; // 可以访问私有成员
}
};
在上面的例子中,friendFunction
函数是一个友元函数,能够访问MyClass
类中的私有成员num
。
友元函数的优点是可以实现高效的访问私有成员,但缺点是破坏了封装性和安全性。要慎用。
虚函数是一种特殊的成员函数,能够被覆盖或重写(override)。它被用于实现多态(polymorphism),也就是在不同的情况下采用不同的行为。虚函数使用关键字virtual
进行声明,它的实现方式是在类的虚函数表中保存一个函数指针,用来指向正确的实现。
class MyClass {
public:
virtual void virtualFunction() {
cout << "This is MyClass::virtualFunction" << endl;
}
};
class DerivedClass: public MyClass {
public:
void virtualFunction() override {
cout << "This is DerivedClass::virtualFunction" << endl;
}
};
在上面的例子中,MyClass
类中的virtualFunction
函数是一个虚函数,DerivedClass
类中的virtualFunction
函数是它的派生类,用override
来修饰,覆盖了MyClass
类中的virtualFunction
函数。当‘DerivedClass'对象通过基类指针调用虚函数时,它实际上调用的是被覆盖的虚函数。
虚函数的优点是可以实现多态行为,使得程序更加灵活和可维护,但缺点是会引入一定量的性能开销。
友元函数和虚函数的区别在于它们的用途和实现方式不同。
友元函数只是一种访问私有成员的方式,它是一个普通的函数,不能被继承或重写,也不能实现多态。
虚函数是一种多态机制,能够被继承或重写,用于在不同的情况下采用不同的行为。虚函数的实现方式是通过虚函数表实现的。虚函数的使用可以增加程序的灵活性和可维护性,但会引入一定量的性能开销。
在实际开发中,应该充分考虑友元函数和虚函数的实现方式和优缺点,选择合适的方式访问和操作私有成员和实现多态行为。