2012-11-19 35 views
5

Nếu tôi có một lớp cơ sở:nguồn gốc lớp Constructor Calls

class Base{ 
    ... 
}; 

và một lớp có nguồn gốc

class Derived : public Base{ 
    ... 
} 

không lớp được thừa kế này luôn gọi constructor mặc định của lớp cơ sở? tức là hàm tạo không có tham số? Ví dụ Nếu tôi định nghĩa một constructor cho lớp cơ sở:

Base(int newValue); 

nhưng tôi không xác định constructor mặc định (các nhà xây dựng parameterless):

Base(); 

(Tôi nhận ra điều này chỉ là một tuyên bố và không định nghĩa) Tôi gặp lỗi, cho đến khi tôi xác định hàm khởi tạo mặc định không có tham số. Đây có phải là do hàm tạo mặc định của một lớp cơ sở là lớp khởi tạo được gọi bởi một lớp dẫn xuất không?

+0

Bạn có thể kiểm tra bằng cách tạo hàm tạo mặc định trong lớp cơ sở in một thứ gì đó duy nhất cho màn hình. Đây là một cách hay để kiểm tra những thứ như thế này và bạn sẽ học được mọi thứ! –

Trả lời

9

Có, theo mặc định, hàm tạo mặc định được gọi. Bạn có thể đi xung quanh này bằng cách gọi một cách rõ ràng một constructor không mặc định:

class Derived : public Base{ 
    Derived() : Base(5) {} 
}; 

này sẽ gọi các nhà xây dựng cơ sở mà phải mất một tham số và bạn không còn phải khai báo constructor mặc định trong lớp cơ sở.

1

Lý do tại sao hàm tạo mặc định được gọi là trong trường hợp nếu bạn đã tạo bất kỳ đối tượng nào và trong trường hợp đó bạn chưa chuyển đối số (bạn có thể muốn khởi chạy chúng sau này trong chương trình). Đây là trường hợp chung nhất, đó là lý do tại sao gọi hàm dựng mặc định là cần thiết.

1

Theo mặc định trình biên dịch cung cấp ba giá trị mặc định:

  1. Mặc định (parameterless) ctor

  2. Sao chép ctor

  3. điều hành Phân

Trong trường hợp nếu bản thân bạn cung cấp Ctor được tham số hóa hoặc Sao chép Ctor rồi comp iler không cung cấp cho Ctor mặc định, vì vậy bạn rõ ràng phải viết Default Ctor.

Khi tạo đối tượng lớp có nguồn gốc, theo mặc định, hãy tìm kiếm Ctor mặc định của Base và nếu chúng tôi chưa cung cấp thì trình biên dịch sẽ phát ra lỗi. Tuy nhiên chúng ta có thể làm cho Ctor lớp Derived gọi CSC cơ sở được chỉ định của chúng ta.

class Base { 
public: 
Base(int x){} 
}; 

class Derived { 
public: 
Derived():Base(5){}    //this will call Parameterized Base Ctor 
Derived(int x):Base(x){}  //this will call Parameterized Base Ctor 
} 
0

Có, theo mặc định, hàm tạo mặc định được gọi. Nhưng trong trường hợp lớp cơ sở của bạn đã paramterized constructor sau đó bạn có thể gọi constructor mặc định không theo hai cách .:

option 1: by explicitly calling a non-default constructor: 

class Derived : public Base{ 
Derived() : Base(5) {} 
}; 

Phương án 2:

in base class constructor set the parameter default value to 0, so it will 
act as default as well as paramterized constructor both 

for example: 

class base 
{ public: 
base(int m_a =0){} 
}; 

class Derived 
{ public: 
Derived(){} 
}; 

trên cách tiếp cận sẽ làm việc tốt cho cả gọi constructor paramterized và mặc định gọi hàm dựng.

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