01/10/2018, 09:56

Gọi method của child class

Chào mọi người!

Mọi người có biết cách nào để sử dụng con trỏ tới base class (pure virtual), có thể gọi method - chỉ khai báo trong child class - không ạ?

VD:

class Base
{
public: 
virtual void A(void) = 0;
}

class Child : public Base
{
public:
void A(void) {};
void B(void) {//do st;}
}

Có cách nào con trỏ kiểu A*, có thể gọi hàm B hay không?

明玉 viết 11:58 ngày 01/10/2018

Muốn gọi hàm số B thì bạn phải có object kiểu Child, làm mọi cách để chuyển về kiểu Child (ép kiểu, v.v.)

Công Vũ viết 12:01 ngày 01/10/2018

Mình đang hỏi cái “v.v.” kia cụ thể như nào bạn ạ! Bạn có thể giúp mình không?

明玉 viết 12:00 ngày 01/10/2018

Trình bày cụ thể và viết ngữ pháp rõ ràng vào, đưa code ví dụ chỗ nào mà bạn muốn gọi hàm đó ra (tất nhiên là ngoài 2 class trên). Câu cú của bạn ở post 1 mình chả hiểu tẹo nào.

Tao Không Ngu. viết 12:01 ngày 01/10/2018

HI Công Vũ.
Con trỏ lớp nào thì chỉ gọi phương thức của lớp đó thôi. Bạn nuốn gọi phương thức của lớp khác bạn cần ps kiểu nó về kiểu của lớp đó.
VD:

A *a = new B();//Nếu B kế thừa từ A thì con trỏ lớp A có thể trỏ đến đối tượng lớp B.
a->Amethood(); //Gọi phương thức lớp A.
B *b = (B*) a; //Ep kiểu.
b->Bmethood(); //Gọi phương thức của lớp B.
Lone viết 12:03 ngày 01/10/2018

trước hết là bạn format lại code nhìn cho nó sáng sủa nhé.

base class của bạn là pure vitual thì bạn không trỏ đến để dùng được tại vì nó là abstract.
còn nếu bạn muốn dùng con trỏ kiểu Base (con trỏ kiểu Base khác với con trỏ trỏ đến Base nhé) thì có thể ép kiểu cho nó thành kiểu Child thì mới gọi được hàm B. nếu không nó chỉ gọi được hàm A thôi, lý do là vì khi nó là con trỏ kiểu Base, trong Base có hàm ảo A thì nó chỉ “nhìn thấy” hàm A và không biết đến sự tồn tại của hàm B, khi nó trỏ đến vùng nhớ kiểu Child, hàm A được overload và nó gọi được hàm A. Theo những gì mình biết là như vậy.

#include <iostream>

using namespace std;

class Base
{
public:
	virtual void A(void) = 0;
};

class Child : public Base
{
public:
	void A(void) {
		cout << 1;
	};
	void B(void) {
		A();
		cout << 2;
	}
};

int main(int argc, char const *argv[]) {
	Child* x = new Child(); // ok
	Base* y = new Child(); // ok
	// Base* z = new Base(); // lỗi vì Base là abstract class
	// Child* t = new Base(); // lỗi vì như trên
	//y->B(); // lỗi vì y là con trỏ kiểu Base
	y->A(); // ok
	((Child*)y)->B(); // ok
	x->B(); // ok

	return 0;
}
Công Vũ viết 12:11 ngày 01/10/2018

Mình hiểu r. Cảm ơn mọi người đã giúp đỡ!!!

rogp10 viết 12:02 ngày 01/10/2018

Để cho chắc ăn thì bạn nên test trước khi cho cast kiểu này.

Bài liên quan
0