tôi đã thực hiện một mã kiểm tra như sau:mơ hồ trong đa kế thừa giao diện trong C++
#include <iostream>
using namespace std;
#ifndef interface
#define interface struct
#endif
interface Base
{
virtual void funcBase() = 0;
};
interface Derived1 : public Base
{
virtual void funcDerived1() = 0;
};
interface Derived2 : public Base
{
virtual void funcDerived2() = 0;
};
interface DDerived : public Derived1, public Derived2
{
virtual void funcDDerived() = 0;
};
class Implementation : public DDerived
{
public:
void funcBase() { cout << "base" << endl; }
void funcDerived1() { cout << "derived1" << endl; }
void funcDerived2() { cout << "derived2" << endl; }
void funcDDerived() { cout << "dderived" << endl; }
};
int main()
{
DDerived *pObject = new Implementation;
pObject->funcBase();
return 0;
}
Lý do tôi viết mã này là để kiểm tra nếu funcBase function() có thể được gọi trong một thể hiện của DDerived hoặc không phải. Trình biên dịch C++ của tôi (Visual Studio 2010) đã cho tôi một thông báo lỗi biên dịch khi tôi cố biên dịch mã này. Theo tôi, không có vấn đề gì trong mã này bởi vì chắc chắn rằng hàm funcBase()
sẽ được thực hiện (do đó overriden) trong một số lớp dẫn xuất của giao diện DDerived
, bởi vì nó là ảo thuần túy. Nói cách khác, bất kỳ biến con trỏ nào của loại Implementation *
phải được liên kết với một cá thể của một lớp bắt nguồn từ Implentation và ghi đè hàm funcBase()
.
Câu hỏi của tôi là, tại sao trình biên dịch cung cấp cho tôi thông báo lỗi như vậy? Tại sao cú pháp C++ được định nghĩa như vậy; tức là, để coi trường hợp này là lỗi? Làm thế nào tôi có thể làm cho mã chạy? Tôi muốn cho phép thừa kế nhiều giao diện. Tất nhiên, nếu tôi sử dụng "công ảo" hoặc tái khai báo hàm funcBase()
trong Implementation
như
interface DDerived : public Derived1, public Derived2
{
virtual void funcBase() = 0;
virtual void funcDDerived() = 0;
};
sau đó tất cả mọi thứ chạy không có vấn đề. Nhưng tôi không muốn làm điều đó và tìm kiếm phương pháp thuận tiện hơn, bởi vì thừa kế ảo có thể làm suy giảm hiệu suất, và việc khai báo lại quá tẻ nhạt để làm nếu quan hệ thừa kế của các lớp là rất phức tạp. Có phương pháp nào để cho phép đa thừa kế các giao diện trong C++ khác ngoài việc sử dụng thừa kế ảo không?
Sức mạnh tâm linh của tôi cho tôi biết rằng lỗi này được gọi đến hàm lớp cơ sở không rõ ràng. –
Nhưng nó không phải là một lớp cơ sở, nó hoặc là một giao diện cơ bản hoặc một cấu trúc cơ sở. –
có thể trùng lặp của [C++ Multiple Inheritance - tại sao bạn không làm việc?] (Http://stackoverflow.com/questions/5864466/c-multiple-inheritance-why-you-no-work) –