Tôi có một con trỏ lớp cơ sở trỏ đến đối tượng lớp dẫn xuất. Tôi đang gọi hàm foo()
bằng cách sử dụng hai cách khác nhau trong mã bên dưới. Tại sao Derived::foo()
được gọi trong trường hợp đầu tiên? Không nên (*obj).foo()
gọi Base::foo()
hoạt động vì nó đã bị hủy đăng ký?Gọi hàm ảo bằng đối tượng dereference
class Base
{
public:
Base() {}
virtual void foo() { std::cout << "Base::foo() called" << std::endl; }
virtual ~Base() {};
};
class Derived: public Base
{
public:
Derived() : Base() {}
virtual void foo() { std::cout << "Derived::foo() called" << std::endl; }
virtual ~Derived() {};
};
int main() {
Base* obj = new Derived();
// SCENARIO 1
(*obj).foo();
// SCENARIO 2
Base obj1 = *obj;
obj1.foo();
return 0;
}
Giá trị mô tả cắt. –