下面是关于C++虚函数的知识点和对应的例子:
- 虚函数是用virtual关键字声明的类成员函数。在派生类中重新定义该函数时,如果没有使用virtual关键字,则该函数不再是虚函数。
例如:
class Shape {
public:
virtual void draw() { // 声明为虚函数
cout << "Drawing a shape." << endl;
}
};
class Circle : public Shape {
public:
void draw() { // 重写draw函数
cout << "Drawing a circle." << endl;
}
};
int main() {
Shape* s = new Circle();
s->draw(); // 执行Circle的draw函数
delete s; // 释放内存
return 0;
}
- C++虚函数的实现机制是通过虚函数表来实现的。每个包含虚函数的类都有一个虚函数表,其中存储了该类所有虚函数的地址。
例如:
class A {
public:
virtual void foo() {
cout << "A::foo" << endl;
}
virtual void bar() {
cout << "A::bar" << endl;
}
};
class B : public A {
public:
void foo() override {
cout << "B::foo" << endl;
}
void bar() override {
cout << "B::bar" << endl;
}
};
int main() {
B b;
A* pa = &b;
pa->foo(); // 执行B::foo
pa->bar(); // 执行B::bar
return 0;
}
- 如果虚函数不需要在派生类中被重新定义,则可以使用纯虚函数。纯虚函数是通过在函数声明后加上"=0"来声明的。
例如:
class Shape {
public:
virtual void draw() = 0; // 声明为纯虚函数
};
class Circle : public Shape {
public:
void draw() override { // 实现draw函数
cout << "Drawing a circle." << endl;
}
};
int main() {
Shape* s = new Circle();
s->draw(); // 执行Circle的draw函数
delete s; // 释放内存
return 0;
}
- 虚析构函数用于正确地销毁基类指针指向的对象。如果基类析构函数不是虚函数,则可能导致派生类对象没有得到正确地销毁。
例如:
class Base {
public:
virtual ~Base() { // 声明为虚析构函数
cout << "Base destructor." << endl;
}
};
class Derived : public Base {
public:
~Derived() {
cout << "Derived destructor." << endl;
}
};
int main() {
Base* b = new Derived();
delete b; // 输出"Derived destructor."和"Base destructor."
return 0;
}