Tôi chỉ khám phá ra hành vi sau: có đối tượng thuộc loại B
bắt nguồn từ loại A
, loại cuối cùng trong khi xây dựng A
là A
và không B
. Điều này có thể được quan sát với các ví dụ sau:Loại đối tượng thay đổi trong khi xây dựng
#include <iostream>
#include <typeinfo>
class A
{
public:
A() { std::cout << &typeid(*this) << std::endl; }
};
class B : public A
{
public:
B() : A() { std::cout << &typeid(*this) << std::endl; }
};
int main()
{
A a;
B b;
return 0;
}
Một chạy của mã này (biên soạn với gcc 4.8.5) như sau:
0x400ae0
0x400ae0
0x400ac0
Chúng ta có thể thấy rằng kiểu trả về bởi typeid trong A::A()
là A
và không B
, và sau đó loại cuối cùng thay đổi để trở thành B
.
Tại sao?
Có thể biết loại cuối cùng "thực" trong khi xây dựng lớp cha không?
bối cảnh của tôi là như sau:
Tôi có một tầng lớp phụ huynh Resource
và một số lớp kế thừa từ nó. Tôi cũng có một thông báo ResourceManager
bởi mỗi lần tạo tài nguyên và phải biết loại cuối cùng của tài nguyên được tạo. Những gì tôi đang làm để tránh mã trùng lặp là điều sau đây, nhưng nó không hoạt động:
class Resource
{
public:
Resource() { ResourceManager::notifyCreation(*this); }
~Resource() { ResourceManager::notifyDestruction(*this); }
};
class MyResource : public Resource
{
// I don't have to care to the manager here
};
Tôi biết tôi có thể làm được thông báo trong mỗi constructor/destructor của trẻ em, nhưng nó ít mạnh mẽ (có thể lỗi nếu một tài nguyên được instanciated mà không cần thông báo cho người quản lý). Bạn có ý tưởng giải pháp nào không?
Umm ... '& typeid (....)' ?? – WhiZTiM
'* this' trong' A' luôn là 'A', tại sao bạn mong đợi' typeid' khác? –
@WhiZTiM tại sao? Giá trị trả về của typeid là duy nhất trong bộ nhớ cho mỗi loại. – Caduchon