2011-09-08 30 views
24

Lỗi là ở đây:"Không thể phân bổ một đối tượng kiểu trừu tượng" lỗi

vector<Graduate *> graduates; 
graduates.push_back(new AliceUniversity(identifier,id,salary,average)); 

ông bà lớp:

Graduate::Graduate(char identifier, 
        long id, 
        int salary, 
        double average) 
    : _identifier(identifier), 
     _id(id),_salary(salary), 
     _average(average) 
{ 
} 

lớp phụ huynh:

UniversityGraduate::UniversityGraduate(char identifier, 
             long id, 
             int salary, 
             double average) 
    : Graduate(identifier,id,salary,average) 
{ 
} 

thực tế lớp/con:

AliceUniversity::AliceUniversity(char identifier, 
           long id, 
           int salary, 
           double average) 
    : UniversityGraduate(identifier,id,salary,average) 
{ 
    _graduateNum++; 
    _sumOfGrades += average; 
    _avrA = getAverage(); 
} 

Tôi biết đó là một shot dài, tôi không thể viết toàn bộ mã ở đây ...

+0

Điều này sẽ không thực hiện - đăng mã thực, và ở những nơi cụ thể nơi bạn khai báo các hàm ảo thuần túy (tìm kiếm '= 0;'). –

+0

các hàm tạo hoàn toàn không liên quan, bạn nên đăng các khai báo – lurscher

Trả lời

70

Trong C++ một lớp học với ít nhất một pure virtual function được gọi abstract class. Bạn không thể tạo đối tượng của lớp đó, nhưng chỉ có thể có con trỏ hoặc tham chiếu đến nó.

Nếu bạn bắt nguồn từ lớp trừu tượng, hãy đảm bảo bạn ghi đè và xác định tất cả các chức năng ảo thuần túy cho lớp học của bạn.

Từ đoạn mã của bạn Lớp học của bạn AliceUniversity có vẻ là một lớp trừu tượng. Nó cần ghi đè và xác định tất cả các hàm ảo thuần túy của các lớp GraduateUniversityGraduate.

Chức năng ảo thuần túy là các chức năng có số = 0; ở cuối khai báo.

Ví dụ: virtual void doSomething() = 0;

Đối với một câu trả lời cụ thể, bạn sẽ cần phải đăng định nghĩa của lớp mà bạn nhận được lỗi và các lớp từ đó lớp học mà được phát sinh.

+0

// Bạn không thể tạo các đối tượng của lớp đó, nhưng chỉ có thể có con trỏ hoặc tham chiếu đến nó.// Điều đó có đúng không? – Naveen

+0

@Naveen: Đúng vậy. –

15

Bạn phải có một số hàm ảo được khai báo trong một trong các lớp cha và không bao giờ được triển khai trong bất kỳ lớp con nào. Đảm bảo rằng tất cả các chức năng ảo được thực hiện ở đâu đó trong chuỗi kế thừa. Nếu định nghĩa của một lớp bao gồm một hàm ảo thuần túy không bao giờ được triển khai, một thể hiện của lớp đó sẽ không bao giờ được xây dựng.

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