Có, tôi biết rằng downcast sử dụng dynamic_cast
không thể biên dịch nếu Base
không phải là đa hình, nhưng vấn đề của tôi không phải là về việc này.`dynamic_cast` từ Base to Derived
class Base {
public:
virtual void bar()
{
cout << "bar\n";
}
};
class Derived: public Base {
public:
void foo()
{
cout << "foo\n";
}
};
int main()
{
Base *pb;
Derived *pd;
pb = new Derived; //Base* points to a Derived object
pd = dynamic_cast<Derived*>(pb);
pd->foo(); //outputs foo
pb = new Base; //Base* points to a Base object
pd = dynamic_cast<Derived*>(pb);
pd->foo(); //outputs foo, too. Why?
}
Tôi nghĩ khi pb = new Derived;
, pb
thực trỏ đến một đối tượng Derived
nằm trong heap. Sau pd = dynamic_cast<Derived*>(pb);
, pd
cũng trỏ đến đối tượng Derived
, vì vậy pd->foo()
phải OK.
Nhưng khi pb = new Base;
, những gì pb
điểm để là một đối tượng Base
trong đống, sau đó sau khi pd = dynamic_cast<Derived*>(pb);
, làm thế nào có thể pd->foo()
công trình? Đã dynamic_cast
biến đối tượng Base
trong đống thành đối tượng Derived
?
Khi tôi nói 'pd-> foo();', thì 'foo()' sẽ được gọi là không có vấn đề 'pd' là' NULL' hay không? – Alcott
@Alcott yes, nhưng tham số 'this' sẽ được chuyển thành NULL (vì đó là giá trị của' pd'). Do đó, sự cố xảy ra khi bạn hủy bỏ nó bằng cách truy cập 'a' trong ví dụ của Rohan. – littleadv
Phần lớn phụ thuộc vào trình biên dịch, và như @Luchian Grigore đã đề cập, mọi thứ đều có thể xảy ra. Vì vậy, trong hầu hết các trường hợp, có, nhưng nó là một cái gì đó bạn không thể đếm trên. –