liên quan: Does "virtual base class in the case of multilevel inheritance" have significanceC++ tại sao thừa kế ảo cho phép phòng ngừa thừa kế tiếp theo?
Tôi có một lớp mẫu có thể được thừa hưởng từ để truyền đạt một số lựa chọn chức năng. Tuy nhiên, nó muốn ngăn chặn bất kỳ lớp học từ kế thừa thêm từ bất cứ điều gì thừa kế nó.
Sau đây dường như đạt được điều này:
template<typename Child>
class SealingClass
{
public:
/*public methods etc*/
private:
SealingClass() {}
friend Child;
};
//simplify a bit:
#define Seal(x) public virtual SealingClass<x>
Bây giờ, tôi có thể kế thừa từ các lớp trên, như sau:
class NewClass: Seal(NewClass) {};
Và nếu tôi sau đó cố gắng kế thừa một lần nữa từ NewClass
, như trong :
class AnotherClass: public NewClass {};
và sau đó tạo một thể hiện của lớp đã nói:
AnotherClass a;
Tôi gặp lỗi mong muốn, liên quan đến hàm tạo trong SealingClass
là riêng tư.
Vì vậy, mọi thứ hoạt động như tôi muốn!
Tuy nhiên, tôi đã nhận thấy rằng nếu tôi loại bỏ các từ khóa virtual
từ xác định ..
#define Seal(x) public SealingClass<x>
..my instantiation của AnotherClass
hiện đang làm việc tốt.
Tôi hiểu rằng từ khóa virtual
, trong ngữ cảnh này, có nghĩa là chỉ một thể hiện của lớp cơ sở được xác định trong trường hợp đa thừa kế (ví dụ: thừa kế kim cương).
Nhưng, tại sao nó ảnh hưởng đến chức năng của các bên trên?
Cảm ơn :)
Từ perusing câu trả lời được liên kết ở trên, có vẻ như đó là do thứ tự các lớp được thừa hưởng hầu như được kế thừa, điều này sẽ có ý nghĩa! – jsdw
IIRC bạn phải khởi tạo một lớp cơ sở ảo trong kiểu dẫn xuất nhất, trong khi bạn khởi tạo các lớp cơ sở không ảo trong kiểu dẫn xuất tiếp theo. – dyp
Tôi cho rằng bạn cũng có một hàm tạo bản sao 'private'? Nếu không, bạn có thể chỉ đơn giản là làm cho tất cả các nhà xây dựng con của bạn sử dụng để xây dựng 'SealingClass', bỏ qua hoàn toàn con dấu. –