if ((a >= 11 && a <= 14) || m == 0 || (m >= 5 && m <= 9))
std::unique_ptr<Strategy> strategies[N]
. Если нет — приходится как-то извращаться, и об этом не будем.unsigned char code() const;
std::unique_ptr<Strategy>& thatObject = strategies[i];
switch (getSomeByte) {
case CODE_DUPLICATE:
thatObject = new DuplicateStrategy();
break;
case CODE_MACRO:
thatObject = new MacroStrategy();
break;
default:
// можно ничего не делать. Можно сообщить об ошибке.
}
thatObject->read();
using EvClick = void (*)();
Class Model{
public:
void click() { if (fOnClick) fOnClick(); }
void setOnClick(EvClick x) { fOnClick = x; }
private:
EvClick fOnClick = nullptr;
}
class ClickEvent {
public:
int x, y;
virtual ~ClickEvent();
}
using EvClick = void (*)(ClickEvent&);
#include <iostream>
class A {
public:
int a;
virtual void doA() {}
virtual ~A() = default;
};
// class B, C, D, E аналогично {
class DE : public D, public E { int de; };
class AB : public A, public B { int ab; };
class CDE : public C, public DE { int cde; };
class All : public AB, public CDE {};
struct Vtable {
uint32_t d[1];
};
union PObject {
void* asVoid;
Vtable** asVtable;
char* asRaw;
};
int main()
{
All all;
All* pAll = &all;
E* pThis = &all;
std::cout << pAll << " " << pThis << std::endl;
PObject pX;
pX.asVoid = pThis;
while (true) {
uint32_t offset = -(*pX.asVtable)->d[-2];
std::cout << "Got offset " << offset << std::endl;
if (offset == 0)
break;
pX.asRaw -= offset;
std::cout << "Got pointer " << pX.asVoid << std::endl;
}
return 0;
}
myClass = dynamic_cast<MyClass*>(interface);
int __fastcall SomeObject::ButtonClick(TObject* Sender)
{
TButton* button = dynamic_cast<TButton*>(Sender);
...
}
ptr
в некорректном состоянии, и деструктор ~T1()
не может его уничтожить, или какая-то из операций над ptr
не подозревает, что объект под ptr выпотрошен.