Hỏi về kế thừa trên C++

#include <iostream>
using namespace std;

class A
{
	public:
		void fun()
		{
			cout<<"Fun() of A ";
		}
		void fun(int t)
		{
			cout<<"Fun(int) of A ";
		}
};

class B : public A
{
	public:
		void fun() {cout<<"Fun() of B ";}

};

int main()
{

	B b;
	b.fun(1);
	return 0;
}

Tại sao khi mình khai bào hàm void fun() ở class B thì mình lại ko kế thừa đc thằng void fun(int) nữa nhỉ, mình bỏ thằng fun() tại B thì nó chạy bình thường

2 Likes
#include <iostream>
using namespace std;

class A
{
public:
	void fun()
	{
		cout<<"Fun() of A ";
	}
	void fun(int t)
	{
		cout<<"Fun(int) of A ";
	}
};

class B : public A
{

public:
using A::fun;
	void fun() {cout<<"Fun() of B ";}

};

int main()
{

B b;
b.fun();
return 0;
}
1 Like

nếu em đọc hiểu tiếng Anh thì vào thẳng sào huyệt mà đọc lý do :V https://isocpp.org/wiki/faq/strange-inheritance#overload-derived

In other words, there is no overload resolution between D and B . Overload resolution conceptually happens in one scope at a time:

khi nó tìm fun(int) nó chỉ tìm trong class B chứ ko tìm ở trong mấy class mà B kế thừa :V Có lẽ là vì C++ có đa kế thừa nên nếu tìm tận gốc rễ chắc chậm (từ B tìm X,Y,Z, từ X tìm D E F, v.v… cấp số nhân) nên người ta mặc định là tìm “tại chỗ” thôi. Cách giải quyết là viết thêm using A::fun như @kakaducsy đã chỉ để trình dịch nó biết mà tìm thêm fun(int) trong class A.

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