Hàm ảo- Class OOP

Mọi người ơi, mình bị lỗi

main.cpp:46:9: error: no matching function for call to ‘Dog::Dog()’
     Dog dogy;

Với đoạn code dưới đây. Không hiểu là bị sai gì?
Mọi người giúp mình nhé

#include<iostream>
using namespace std;

class Pet 
{
    protected:
    string name;
    public:
    Pet(string n)
    {
        name = n;
    }
    virtual string getSound(){return "";};
    void makeSound(void) { cout << name << "says: " << getSound() << endl; }
};

class Dog : public Pet
{
    public:
    Dog(string n): Pet(n){}
    string getSound( )
    {
         return"gaugau";
    }
    
};


int main()
{

    Pet *point; 
    Dog dogy;
    point=&dogy;
    point->makeSound();
    
    return 0;
}
 Pet *point = new Dog("hello"); 
point->makeSound();
delete point;
return 0;

Mình xử lý như thế này thì oke, nhưng mình muốn biết tại sao cách trên sai

Hi ITSRD.

  1. Bạn đọc qua một chút về nội quy và cách thêm code vào bài đăng sao cho dễ nhìn. VD:
int main(int argc, char **argv) {
    return 0;
}
  1. Bạn xem lại tài liệu về C++ trong đó có ghi khi người dùng định nghĩa một hàm khởi tạo thì hàm khởi tạo mặc định bị loại bỏ.
1 Like

Cảm ơn đã sửa và góp ý cho mình nhé, nhưng mà mình chưa hiểu ý bạn, mình gọi bài đăng hỏi là cách một, đoạn code mình comment là cách 2, khi nào thì mình nên dùng toán tử new, khi nào mình dùng như cách 1, mình chưa tại sao cách 1 không xử lý được.

theo mình thấy bạn nên dùng:

Dog(string n = " "): Pet(n){}

vì khi bạn khỏi tạo cái hàm Dog dogy; nó cần 1 argument nên bạn khai báo k đúng template của nó. và bạn cũng k khởi tạo khi khai báo trong hàm.

2 Likes

Hi ITSRD.

  1. Bạn định nghĩa hàm Dog(string n): Pet(n){} nên hàm Dog() (Hàm khởi tạo mặc định) bị loại bỏ nên báo lỗi no matching function for call to Dog::Dog().
  2. Bạn có thể gọi hàm khởi tạo khi tạo đối tượng: Dog dog("name");.
  3. Khi nào new khi nào khởi tạo thì tùy vào thiết kế code không có quy tắc nào cả. Cơ bản là cả hai có thể dùng qua lại như nhau được nhưng hiệu năng khác nhau. Theo mình thì các biến (đối tượng) truyền vào và lấy ra thường được new và nơi nào tạo thì nơi đó quả lý bộ nhớ delete nơi dùng chỉ được chia sẻ quyền sử dụng (smart poiter). Các biến nội bộ hàm thường được khởi tạo thông thường nếu không bắt buộc phải cấp phát động.
2 Likes

à Mình hiểu rồi, mình cảm ơn nhiều nhé!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?