📜  C++中友元函数和虚函数的区别(1)

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

C++中友元函数和虚函数的区别

在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'对象通过基类指针调用虚函数时,它实际上调用的是被覆盖的虚函数。

虚函数的优点是可以实现多态行为,使得程序更加灵活和可维护,但缺点是会引入一定量的性能开销。

区别

友元函数和虚函数的区别在于它们的用途和实现方式不同。

友元函数只是一种访问私有成员的方式,它是一个普通的函数,不能被继承或重写,也不能实现多态。

虚函数是一种多态机制,能够被继承或重写,用于在不同的情况下采用不同的行为。虚函数的实现方式是通过虚函数表实现的。虚函数的使用可以增加程序的灵活性和可维护性,但会引入一定量的性能开销。

在实际开发中,应该充分考虑友元函数和虚函数的实现方式和优缺点,选择合适的方式访问和操作私有成员和实现多态行为。