Computer >> Máy Tính >  >> Lập trình >> C ++

Gọi các hàm ảo bên trong các hàm tạo trong C ++

Việc gọi hàm ảo từ một hàm tạo hoặc hàm hủy là nguy hiểm và nên tránh bất cứ khi nào có thể vì hàm ảo mà chúng ta gọi được gọi từ lớp Cơ sở chứ không phải từ lớp dẫn xuất.

Lý do là trong C ++ Siêu lớp được xây dựng trước các lớp dẫn xuất. Vì vậy, trong ví dụ sau, vì B phải được khởi tạo, trước khi D được khởi tạo. Khi phương thức khởi tạo của B được gọi, nó chưa phải là D, vì vậy bảng hàm ảo vẫn có mục nhập cho bản sao của B của s ().

Mã mẫu

#include<iostream>
using namespace std;
class B {
   public: B() {
      s();
   }
   virtual void s() {
      cout << "Base" << endl;
   }
};

class D: public B {
   public: D() : B() {}
   virtual void s() {
      cout << "Derived" <<endl;
   }
};

int main() {
   D de;
}

Đầu ra

Base