草庐IT

c++ - 使用基类指针确定子类的类型

有没有办法通过基类指针来判断子类的类型?我在这样的类构造函数中声明了一个指针在.h文件中baseclass*screen;在构造函数中screen=newchildclass();假设基类有5个不同的子类,在我的程序中我切换指针以指向各种子对象,我如何确定屏幕当前指向的对象的类型? 最佳答案 不要。使用虚拟调度为不同的派生类型实现不同的行为。 关于c++-使用基类指针确定子类的类型,我们在StackOverflow上找到一个类似的问题: https://sta

c++ - 安全删除窗口子类化?

我正在尝试使用全局CBTHook子类化Windows系统上当前聚焦的窗口。这与thisquestion中发生的事情有关。,但错误是不同的。当这个子类化生效时,会阻止Opera(10.50版)的主窗口显示。Opera有一个“启动画面”,您需要单击主窗口的“开始”才能显示在Opera未正常关闭后出现的画面。每当弹出此窗口时,Opera的主窗口将不会显示。如果Opera正常关闭,并且没有显示启动画面,主窗口会正常显示。HHOOKhHook;HWNDhWndSubclass=0;voidSubclassWindow(HWNDhWnd){Unsubclass();FARPROClpfnOldWn

c++ - 在父类(super class)中调用抽象方法,并在C++中的子类中实现它?

在Java中,可以编写具有未实现的抽象方法和调用抽象方法的非抽象方法的抽象父类(superclass)。然后在子类中实现了抽象方法。当您创建子类的实例时,父类(superclass)使用子类中的实现。我如何在C++中完成此操作?这就是我的意思,但是在Java中:父类(superclass).javapublicabstractclassSuperClass{publicSuperClass(){method();}privatevoidmethod(){unimplementedMethod();}protectedabstractvoidunimplementedMethod();}

删除指向子类的指针时未释放 C++ 内存

我在代码中使用动态内存分配,在尝试删除指向子类的指针时遇到问题。我发现当我使用delete关键字时,最初分配的内存并没有被释放。该功能适用​​于原始基类。这是一个问题,因为我在arduino上运行代码,RAM很快被耗尽然后崩溃。下面是一些示例代码:classBase{public:Base(){objPtr=newSomeObject;}~Base(){deleteobjPtr;}SomeObject*objPtr;};classSub:publicBase{public:Sub(){objPtr=newSomeObject;}};//thisworksfineintmain(){fo

c++ - 如何避免忘记在子类中定义 operator== ?

我有一个基类并在其上定义了一个运算符==。B是A的子类,我忘记在B上定义operator==。然后A::operator==用于比较B,通常这会产生意想不到的结果。有什么好的方法可以避免这种“忘记”?我添加一个例子来澄清我的问题。classA{public:booloperator==(constA&rhs)const{returni==rhs.i;}inti};classB:publicA{public:intj;}Bb1,b2;b1.i=1;b1.j=2;b2.i=1;b1.j=3;boolb=(b1==b2);//willbetrue 最佳答案

c++ - 用父类(super class)的实例覆盖子类的实例

为了解决问题(实际上是在Ada中),我想出了以下代码。为什么它是合法的?classSuperclass{public:virtualvoidAnnounce(){printf("Iamthesuperclass\n");}};classSubclass:publicSuperclass{public:voidAnnounce(){printf("Iamthesubclass\n");}};intmain(){Superclassosuper;Subclassosub;Superclass*p=&osub;*p=osuper;osub.Announce();return0;}在main(

c++父子类中的同名成员

我在c++编程中遇到一个问题,如果在c++中父类和子类有一个同名的成员:#includeusingnamespacestd;classA{private:intx;public:A(){x=1;}voidSetX(inti){x=i;}};classB:publicA{private:intx;public:B(){}intGetX(){returnx;}};intmain(){Bb;cout程序结果为:-858993460-858993460为什么?返回的是哪个x?感谢您的帮助。 最佳答案 B::GetX将始终返回B::x。A::

c++ - 在 C++ 的子类中强制执行静态方法重载

我有这样的东西:classBase{public:staticintLolz(){return0;}};classChild:publicBase{public:intnothing;};templateintProduce(){returnT::Lolz();}和Produce();Produce();两者都返回0,这当然是正确的,但不需要。无论如何在第二个类中强制执行Lolz()方法的显式声明,或者在使用Produce()时可能抛出编译时错误?还是OO设计不好,我应该做一些完全不同的事情?编辑:我基本上想做的是做这样的事情:Managermanager;manager.Regist

c++ - 调用仅允许子类作为参数的模板化方法

假设我有一组继承自单个父类(superclass)S的类:classS{...};classC1:publicS{...};classC2:publicS{...};然后假设我有一个模板化方法:templatevoidfoo(T*instance);我想静态检查foo从未被调用以提供父类(superclass)的实例,而仅被调用以提供(具体的)子类之一(例如显式调用foo(x))这可能吗? 最佳答案 首先,我们可以编写一个特征来检查T是否派生自S,而不是S:templateusingis_strict_base=std::integ

c++ - 有没有一种方法可以在不重新实现的情况下将子类的父虚函数标记为final

如果我有代码:structParent{virtualvoidfn();};structChild:publicParent{virtualvoidfn()overridefinal{Parent::fn();}};有没有办法让Parent::fn只有在通过Child访问时才成为final而无需重新实现fn,以便其他一些class在从Parent派生时可以覆盖fn,但在从Child派生时不能?喜欢:structChild:publicParent{virtualvoidfn()overridefinal=Parent::fn;};还是其他一些语法? 最佳答案