다음 방법이 a) 법적 및 b) 도덕인지 묻는 중입니다. 저는 C++ 03에 중점을두고 질문하지만 C++ 11에 대한 노트도 환영합니다. 아이디어는 바보 같은 B::B(int foo) : A(foo) {}
생성자를 구현하는 데있어 기본 구성이 가능한 파생 클래스를 막는 것입니다.게재 위치가 새로 변경된 진정한 기본 클래스 구조
class Base {
private:
int i;
Base(int i) : i(i) {}
protected:
Base() {}
public:
static Base* create(int i);
};
class Derived : public Base {
};
Base* Base::create(int i) {
Derived* d = new Derived();
Base* b = static_cast<Base*>(d);
delete b;
new(b) Base(i);
return d;
}
내게 말하고 싶은 것은, 뭔가 비린내가 있습니다. 어떤 Derived
클래스가 해당 생성자의 Base
멤버에 액세스하는 경우, 다른 어딘가에 있고 싶습니다. 그렇지 않은 경우 접근법이 나쁜 이유를 확인하는 데 문제가 있습니다.
어쨌든 이것이 받아 들일 수있는 접근 방법이라고 생각되면 참조 회원을 처리하는 방법은 무엇입니까 (int& Base::j
과 같은)?
참고 : 이것은 How can I fake constructor inheritance in C++03?의 후속 질문입니다.
편집 : 질문을 게시 할 때 내가 정신이되어 있어야합니다. 물론 delete b
대신에 나는 b->~Base()
을 의미했습니다. 나는 낮은 혈당을 비난했다!
하나가 있다면'~ 파생 '을 부를 것입니다.'delete b'라고 말하면 제가 원하지 않는 것입니다. – bitmask
@bitmask : 원하는 것은 중요하지 않습니다 ... 기본 클래스에 가상 소멸자가 없으면 언어에서 기본 클래스에 대한 포인터를 삭제할 수 없습니다. –
@bitmask : 모든 것을 논의하는 접근법에는 너무 많은 것들이 잘못되었지만, 예를 들어 메모리 할당/할당 해제, 각 시점에서의 객체의 런타임 유형 등에 대해 생각해야합니다. –