6

Tôi biết rằng hàm tạo mặc định không được kế thừa, như đã nêu trong n3337.Cần một ví dụ cho thấy hàm tạo mặc định không được thừa hưởng

Và có một ví dụ có:

struct B2 { 
    B2(int = 13, int = 42); 
}; 

struct D2 : B2 { 
    using B2::B2; 
}; 

Với lời giải thích khá tốt:

Tập ứng cử viên của nhà xây dựng kế thừa trong D2 cho B2

... 
—B2(int = 13, int = 42) 
—B2(int = 13) 
—B2() 

Và quan trọng nhất:

Tập hợp các nhà xây dựng có mặt trong D2
—D2(), ngầm-tuyên bố constructor mặc định, không được thừa kế

Đối với tôi ví dụ này không hiển thị sự khác biệt, theo một nghĩa rằng ngay cả nếu điều này rất constructor đã được thừa hưởng - hành vi của nó không khác với hàm tạo mặc định được khai báo ngầm.

Tôi cần một ví dụ cho thấy sự khác biệt theo cách có thể dễ hiểu, giả sử, đối tượng quen thuộc với C++ 03 nhưng muốn tìm hiểu C++ 11.


[UPDATE]
Tất cả các câu trả lời (kể cả của riêng tôi) là thuộc loại "nếu mặc định c-tor được thừa hưởng sau đó dụ sẽ biên dịch/biên dịch không".

Tôi muốn câu trả lời có kết quả (hành vi có thể quan sát) khác với cách khác.

Trả lời

2

xem xét:

struct foo 
{ 
    foo() {} 
    foo(int) {} 
}; 

struct bar : foo 
{ 
    using foo::foo; 
}; 

int main() 
{ 
    bar b; 
} 

này biên dịch: Từ bar không có sử dụng tuyên bố nhà thầu, một constructor mặc định sẽ được công bố ngầm.

struct foo 
{ 
    foo() {} 
    foo(int) {} 
}; 

struct bar : foo 
{ 
    using foo::foo; 
    bar(double) {} 
}; 

int main() 
{ 
    bar b; 
} 

Điều này không biên dịch. Hàm khởi tạo mặc định không được kế thừa, và nó không được khai báo ngầm, vì có hàm tạo bar(double).

+0

Nhìn vào đề xuất (ví dụ [N2203] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers /2007/n2203.html)), điều này dường như đã được (một phần của?) Lý do không để kế thừa sao chép/di chuyển và ctors mặc định. – dyp

3

Một sự khác biệt có thể có: thừa kế nhiều hàm tạo từ các lớp với các hàm tạo mặc định. Ví dụ:

struct A { A(int=0); }; 
struct B { B(double=3.14); }; 
struct C : A, B { 
    using A::A; 
    using B::B; 
}; 

C c; 

Nếu constructor mặc định đã được thừa hưởng, C sẽ kế thừa một từ cả hai AB, dẫn đến sự mơ hồ.

Tôi không thể nghĩ ra một trường hợp sử dụng cho đa-constructor thừa kế, vì vậy đây có thể không phải là ví dụ hoàn hảo mà bạn đang tìm kiếm, nhưng đó là một cái gì đó.

1

Dưới đây là ví dụ, có thể được sản xuất từ ​​các tính năng sau đây của nhà xây dựng kế thừa:

12,9 constructors Thừa hưởng
[...]
4) Một nhà xây dựng để tuyên bố có khả năng tiếp cận tương tự như các nhà xây dựng tương ứng trong X.

Vì vậy, đề nghị của tôi là đã được bảo vệ constructor mặc định trong cơ sở:

class Base { 
protected: 
    Base(int) {} 
    Base() = default; 
}; 

Nếu hàm khởi tạo này được bắt nguồn, thì lớp dẫn xuất không thể được khởi tạo bởi vì hàm khởi tạo có nguồn gốc sẽ có quyền truy cập được bảo vệ. Nếu không có nguồn gốc - constructor sau đó mặc định ngầm tuyên bố có quyền truy cập công cộng:

struct Derived : Base { 
    using Base::Base; 
}; 

int main() { 
    Derived d1{}; // not inherited, default constructor is public 
    Derived d2{1}; // not compiling since this c-tor is inherited, thus protected 
} 
Các vấn đề liên quan