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;
}