在C++中Friend函数和Virtual函数的区别

在C++中Friend函数和Virtual函数的区别

C++中,类的数据成员和成员函数分别由public、private和protected三种访问修饰符来加以限定,限定了某个成员只能在类内部访问或只能在类外部访问。但有时候,我们需要一些特殊的访问权限,那么就需要使用到”友元”和”虚函数”这两种机制。虽然这两种机制都可以访问类的私有成员,但它们的实现方式和使用场景是完全不同的。本文将会详细介绍”友元”和”虚函数”的区别和使用方法。

友元函数

友元函数是一个非类成员函数,但是它可以访问一个类的私有成员。友元函数中可以使用该类的任何成员或函数,包括私有成员。对于友元函数而言,它并不属于这个类,所以它不能被继承。友元不属于类成员,因此在其函数名和参数before的尖括号之间不要添加类前缀。

定义友元函数时,需要在类内部提前声明该函数,并且”友元”关键字只需要在函数原型声明的地方使用。示例代码如下:

class A {
    public:
        A(int x = 0):data(x) { }
        friend void Print(A& object); // 友元函数声明
    private:
        int data;
};

void Print(A& object) { // 友元函数定义
    cout << object.data << endl; // 访问对象的私有成员
}

int main() {
    A a(5);
    Print(a);
    return 0;
}

在上面的例子中,Print函数被声明为A类的友元函数,因为它可以访问到A类的私有成员data。通过将一个A类对象传递给Print函数,我们可以使用Print函数访问A类对象的私有成员data。

由于友元函数并不属于类成员,所以它不能被继承,也不能被重载。

虚函数

虚函数是一种特殊的成员函数,它具有运行时多态性的特征。多态是指同一操作作用于不同的对象上面,可以有不同的解释,产生不同的执行结果。具体到 C++ 中,就是指通过基类指针或引用调用一个虚函数时,实际上调用的是派生类中重写的虚函数。

示例代码如下:

class Animal {
    public:
        virtual void makeSound() { // 声明虚函数
            cout << "This is a base class." << endl;
        }
};

class Dog : public Animal {
    public:
        virtual void makeSound() { // 重写虚函数
            cout << "The dog says: woof!" << endl;
        }
};

class Cat : public Animal {
    public:
        virtual void makeSound() { // 重写虚函数
            cout << "The cat says: meow!" << endl;
        }
};

int main() {
    Animal* ptr = new Animal(); // 创建一个Animal对象的指针
    ptr->makeSound(); // 调用Animal的虚函数,输出:This is a base class.
    delete ptr; // 删除由指针指向的对象

    ptr = new Dog(); // 创建一个Dog对象的指针
    ptr->makeSound(); // 调用Dog的虚函数,输出:The dog says: woof!
    delete ptr;

    ptr = new Cat(); // 创建一个Cat对象的指针
    ptr->makeSound(); // 调用Cat的虚函数,输出:The cat says: meow!
    delete ptr;

    return 0;
}

在这个例子中,Animal是一个基类,而Dog和Cat是Animal的两个派生类。每个类都有一个makeSound()的虚函数,但派生类重写了虚函数。我们创建了一个Animal对象的指针,并将它指向一个Animal对象、Dog对象和Cat对象。调用makeSound()时,正常情况下应该输出”This is a base class.”、”The dog says: woof!”和”The cat says: meow!”。

由于makeSound()函数是虚函数,因此在运行时动态绑定到ptr指向的对象。

友元函数和虚函数的区别

  1. 使用范围:友元函数可以访问被声明为友元的类任意一个对象的私有成员,而虚函数只有在类的继承体系中才能发挥作用。

  2. 特性不同:友元函数不属于类成员,它只是被声明为可以访问类成员的一个非成员函数。虚函数是C++中的一个特殊函数,它会在运行时动态绑定到指向的对象。

  3. 实现方式不同:友元函数可以在类内或类外定义,也可以在命名空间中定义。虚函数必须在类内定义,而函数体可以在类内或类外定义。

  4. 调用方式不同:友元函数在调用时使用普通函数的方式调用,而虚函数在通过类指针或引用调用时,会在运行时动态绑定到对象的实际类型。

  5. 使用场景不同:友元函数用于在类之间共享数据,而虚函数用于在继承体系中实现多态。

结论

友元函数和虚函数是C++中两种不同的机制,它们各自在特定场景下才能发挥作用。友元函数用于共享数据,而虚函数用于实现多态。当需要访问类的私有成员时,考虑使用友元函数;而当需要在类继承体系中实现多态时,应该使用虚函数。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程