2016-05-12 16 views
5

Mã sau là phương pháp thử nghiệm ràng buộc trễ() nhưng không nên kết buộc sớm? vì test() phương pháp không phải là ảo trong lớp B (nhưng trong lớp A), và chúng tôi đang sử dụng con trỏ của lớp B.chức năng ảo trong bố mẹ của lớp cha

class A{ 
    public: 
     virtual void test(){ 
      cout<<"test a"; 
     } 
}; 
class B : public A{ 
    public: 
     void test(){ 
      cout<<"Test b"; 
     } 
}; 
class C: public B{ 
    public: 
     void test(){ 
      cout<<"test c"; 
     } 
}; 
int main(){ 
    B *bp; 
    C objc; 
    bp = &objc; 
    bp->test(); // test c 
} 
+5

'kiểm tra' là ảo trong tất cả các lớp ở đây; từ khóa 'virtual' không cần lặp lại. – MicroVirus

Trả lời

5

Khi một chức năng đã được tuyên bố virtual trong một lớp học, nó luôn luôn ảo trong các lớp học được kế thừa từ lớp đó, cho dù bạn sử dụng từ khóa virtual hay không.

Vì vậy, trong lớp học của bạn C, các test() chức năng thực sự là trọng B và riêng test() chức năng A 's.

4

N4296, 10.3§2 (draft version):

Nếu một ảo chức năng thành viên vf được khai báo trong một lớp học cơ sở và trong một lớp học nguồn gốc, xuất phát trực tiếp hoặc gián tiếp từ cơ sở, một thành viên chức năng vf với cùng tên, tham số-type-list (8.3.5), cv-qualification, và ref-qualifier (hoặc vắng mặt) như Base :: vf được khai báo, sau đó Derived :: vf cũng là virtual (có hay không nó là như vậy tuyên bố) và nó ghi đè Base :: vf.

Nhấn mạnh bởi tôi.

Một chức năng ảo vẫn còn ảo trong tất cả các lớp dẫn xuất, bất kể nó được khai báo là virtual trong các lớp dẫn xuất.

Các vấn đề liên quan