2012-05-06 26 views
6

"một cấu trúc có thừa kế công khai theo mặc định" tuyên bố này thực sự có ý nghĩa gì? Và tại sao mã sau đây bị lỗi chỉ vì tôi đã bỏ qua từ khóa 'công khai' trong khi bắt nguồn từ lớp d từ c ??"một cấu trúc có thừa kế công khai theo mặc định"

struct c 
{ 
protected: 
    int i; 
public: 
    c(int ii=0):i(ii){} 
    virtual c *fun(); 
}; 

c* c::fun(){ 
    cout<<"in c"; 
    return &c(); 
} 

class d : c 
{ 
public: 
    d(){} 
    d* fun() 
    { 
     i = 9; 
     cout<<"in d"<<'\t'<<i; 
     return &d(); 
    } 
}; 


int main() 
{ 
    c *cc; 
    d dd; 
    cc = &dd; 
    cc->fun(); 
} 
+0

đừng bỏ qua các cảnh báo mà trình biên dịch ném vào bạn. – moooeeeep

Trả lời

9

Nó có nghĩa là

struct c; 
struct d : c 

tương đương với

struct d : public c 

Mã của bạn là một class mở rộng một struct:

struct c; 
class d : c; 

tương đương với

class d : private c; 

bởi vì class có kế thừa riêng tư theo mặc định.

Và điều đó có nghĩa là tất cả các phương pháp thừa kế và không được ghi đè/quá tải/ẩn từ c đều ở chế độ riêng tư trong d.

+0

lỗi nằm trong dòng cuối cùng thứ hai của chính 'cc = & dd'.Ở đây chúng ta chỉ đơn giản là gán địa chỉ của lớp dẫn xuất đến một con trỏ tới một lớp cơ sở. Những gì có thừa kế công cộng và tư nhân để làm gì với nó ?? – user1232138

+0

@ user1232138 với kế thừa riêng, lớp 'd' không phải là' c'. – juanchopanza

+0

Có một sai lầm trong câu trả lời này: struct c; lớp d: c; tương đương với lớp d: public c; "Structs có thừa kế công khai" có nghĩa là chúng được thừa kế công khai theo mặc định. Bằng chứng: đoạn mã sau biên dịch: struct A {int x; }; loại B: A { void foo() {x = 2; } }; –

2

Khi bạn viết struct và kế thừa từ một cái gì đó mà không chỉ định thông số truy cập, thừa kế đó được coi là public. Khi bạn viết một class và kế thừa từ một cái gì đó mà không chỉ định một specifier truy cập (ngay cả khi một cái gì đó là một struct), thừa kế đó được coi là riêng tư. Trong mã của bạn, bạn đang làm sau, vì vậy thừa kế là riêng tư, do đó các lỗi quan sát được.

Nói cách khác, để nói rằng struct thừa kế là công khai theo mặc định thực sự có nghĩa là thừa kế thực hiện khi viết một struct là công khai theo mặc định, không phải là kế thừa từ một struct là công khai theo mặc định.

5

"một cấu trúc đã thừa kế công theo mặc định" có nghĩa rằng đây

struct Derived : Base {}; 

tương đương với

struct Derived : public Base {}; 

Lớp học có tin thừa kế theo mặc định, vì vậy khi bạn loại bỏ các public từ thừa kế lớp bạn có tương đương với

class Derived : private Base {}; 

Trong kịch bản thừa kế riêng này, Derived không có một là-một mối quan hệ với Base, nó chủ yếu có-mộtBase. Vì vậy, chuyển đổi bạn đang cố gắng thử tại đây:

cc = &dd; 

không được phép.

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