virtual写在基类和派生类的区别
时间: 2024-02-19 12:02:45 浏览: 106
在 C++ 中,使用 `virtual` 关键字声明的成员函数称为虚函数,它的作用是支持多态性,即在运行时确定具体调用的是哪个类的函数。在基类和派生类中使用 `virtual` 关键字的区别如下:
1. 基类中的虚函数
在基类中声明虚函数,可以使得派生类可以重写这个函数,实现自己的特定行为。在基类中,虚函数的定义通常是带有关键字 `virtual` 的成员函数。例如:
```c++
class Base {
public:
virtual void foo() { std::cout << "Base::foo" << std::endl; }
};
class Derived : public Base {
public:
void foo() override { std::cout << "Derived::foo" << std::endl; }
};
```
在基类 `Base` 中,声明了虚函数 `foo`,派生类 `Derived` 重写了这个函数。在使用基类类型的指针或引用调用虚函数时,将根据对象的实际类型动态调用对应的函数。例如:
```c++
Base* p = new Derived();
p->foo(); // 输出 Derived::foo
```
这里通过基类指针 `p` 调用虚函数 `foo`,由于 `p` 指向的是 `Derived` 类型的对象,因此会调用 `Derived` 类的 `foo` 函数,输出字符串 "Derived::foo"。
2. 派生类中的虚函数
在派生类中声明虚函数,可以覆盖基类中的同名虚函数,并且可以通过使用 `override` 关键字来确保函数签名与基类一致。例如:
```c++
class Base {
public:
virtual void foo() { std::cout << "Base::foo" << std::endl; }
};
class Derived : public Base {
public:
void foo() override { std::cout << "Derived::foo" << std::endl; }
virtual void bar() { std::cout << "Derived::bar" << std::endl; }
};
```
在派生类 `Derived` 中,重写了虚函数 `foo`,并且声明了一个新的虚函数 `bar`。在使用派生类类型的指针或引用调用虚函数时,将根据对象的实际类型动态调用对应的函数。例如:
```c++
Base* p1 = new Derived();
p1->foo(); // 输出 Derived::foo
Derived* p2 = new Derived();
p2->foo(); // 输出 Derived::foo
p2->bar(); // 输出 Derived::bar
```
在第一个例子中,使用基类指针 `p1` 调用虚函数 `foo`,由于 `p1` 指向的是 `Derived` 类型的对象,因此会调用 `Derived` 类的 `foo` 函数,输出字符串 "Derived::foo"。
在第二个例子中,使用派生类指针 `p2` 分别调用虚函数 `foo` 和 `bar`,由于 `p2` 指向的也是 `Derived` 类型的对象,因此会调用 `Derived` 类的 `foo` 和 `bar` 函数,输出字符串 "Derived::foo" 和 "Derived::bar"。
阅读全文