对象在将其指针转换为基数后未调用正确的方法

2023-12-14

我遇到的问题是,我尝试调用的方法未被调用,而是调用了其他方法。它的设计非常奇怪而且很大,但我设法用它做了一个例子。这个例子仍然很大,它是我能做的较小的。

#include <iostream>
#include <vector>

class IObserver 
{

};

class IAObserver : public IObserver
{
public:
    virtual void someSpecificMethod(int i) = 0;
};

class ISomeOtherObject
{
public:
    virtual void someMethodFromThatObject() = 0;
};

class SomeOtherObject : public ISomeOtherObject
{
public:
    virtual void someMethodFromThatObject()
    {
        std::cout << "Some implementation from that object" << std::endl;
    }
};

class AObserverImpl : public IAObserver, public SomeOtherObject
{
public:
    virtual void someSpecificMethod(int i)
    {
        std::cout << "Some implementation " << i << std::endl;
    }

    virtual void someMethodFromThatObject()
    {
        std::cout << "Better implementation from our object" << std::endl;
    }
};

class Base
{
public:
    virtual void addObserver(IObserver* observer) = 0;
};

class A : public Base
{
public:
    virtual void addObserver(IObserver* observer)
    {
        m_observers.push_back((IAObserver*)observer);
    }

    void notifyObservers()
    {
        std::vector<IAObserver*>::iterator it;
        for(it = m_observers.begin(); it != m_observers.end(); it++)
        {
            (*it)->someSpecificMethod(5);
        }
    }

private:
    std::vector<IAObserver*> m_observers;
};

int main()
{
    A* a = new A();
    SomeOtherObject* observer = new AObserverImpl();

    a->addObserver((IObserver*)observer);
    a->notifyObservers(); //output: Better implementation from our object
}

这是 Ideonehttp://ideone.com/yAT6M7

正如你所看到的,它应该调用该方法someSpecificMethod但它正在调用该方法someMethodFromThatObject。知道发生了什么事吗?这个物体是切片吗?在 CLion 调试器中,我什至无法调用我的someSpecificMethod方法。我该如何解决这个问题?


问题是你正在使用 C 风格的强制转换,而你应该使用dynamic_cast反而。

C 风格的强制转换对 C++ 对象一无所知,因此它们不进行类型检查。为了在多重继承情况下在基类之间进行转换,您必须使用dynamic_cast确保新指针的所有设置均正确。

如果将示例中的所有 C 风格转换替换为dynamic_cast,那么它应该可以工作。

如果您想了解更多相关内容,请搜索 C++、v-tables 和多重继承。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对象在将其指针转换为基数后未调用正确的方法 的相关文章

  • 从 C 中的 char* 获取单个字符

    有没有办法在 C 中逐字符遍历或从 char 中提取单个字符 考虑以下代码 现在获得单个角色的最佳方式是什么 建议我一种不使用任何字符串函数的方法 char a STRING 其他方式 char i for i a i i i points
  • dup2() 和 exec()

    include
  • 如何通知父线程所有子线程都已终止?

    我有一个控制台应用程序正在移植到 WPF 该应用程序有 3 个工作线程 在将一些输出结果打印到屏幕上之前 这些线程都连接到主线程 我的理解是 如果我尝试在 WPF 应用程序中执行相同的操作 GUI 将被阻止并且不会响应用户 那么如何通知父线
  • WPF Dispatchertimer 延迟反应/冻结

    在我的 WPF 应用程序中 我使用 3 个不同的 DispatcherTimers 一种是用于显示当前时间 一种是每 5 秒运行一次数据库查询 第三个每 1 秒刷新一次自定义按钮的值 当我的程序运行时 有很多延迟 冻结 例如 时间开始正确计
  • 将 void *user_data 转换为对象

    我该如何投射void something到标准 C 中的对象 具体来说我想投void userdata to std map
  • NHibernate IQueryable 集合作为 root 的属性

    我有一个根对象 它有一个集合属性 例如 I have a Shelf object that has Books Now public class Shelf public ICollection
  • 我的 WPF 应用程序未触发 MainWindow_Loaded

    我目前正在关注Pluralsight C Fundamentals Part 1并在Classes and Objects视频部分指导我在 Visual Studio 中创建一个新的 WPF 应用程序并填写代码 这导致以下结果 namesp
  • 函数指针上的未知类型 F TYPE

    include
  • 如何删除实体框架6中的多对多关系

    如果将项目连接为多对多关系 则从数据库中删除项目时会出现问题 我的数据库看起来像 Project lt JobInProject gt Job ProjectID JobInProjectID JobID ProjectID JobID 主
  • 如何在Azure功能中添加razor视图文件?

    我正在创建一个应用程序 它是 azure 函数项目 我想在该项目中使用 Razor 视图 我应该在 azure 函数中使用任何模板引擎吗 得益于一些方面的进步剃刀之光项目 https github com toddams RazorLigh
  • 除空字符串外的任何内容的正则表达式

    是否可以使用正则表达式来检测任何不是 空字符串 的内容 如下所示 string s1 string s2 string s3 string s4 etc 我知道我可以使用修剪等 但我想使用正则表达式 s 将匹配任何包含至少一个非空格字符的字
  • 将授权标头添加到 Web 参考

    我正在尝试向客户端的网络服务发出请求 我不知道客户端的底层平台 我使用 添加 Web 引用 在 Visual Studio 2010 中使用了客户端的 WSDL 并生成了我的代理类 称为 ContactService 我现在需要将如下所示的
  • 执行存储过程时 ExecuteNonQuery() 返回 -1

    我正在尝试在 Visual Studio 中执行存储过程 下面给出 CREATE PROCEDURE dbo addStudent stuName varchar 50 address varchar 100 tel varchar 15
  • 为什么 httpRuntime targetFramework="4.5" 禁止抓取 .ASPXAUTH cookie?

    当我的 web config 具有以下 httpRuntime 时 我的控制器无法获取 cookie ASPXAUTH 它似乎能够获取任何其他 cookie 无论带或不带句点前缀 如果我删除下面的行 它就可以正常工作
  • C++:LPWSTR 在 cout 中打印为地址

    我有一个类型变量LPTSTR 我打印到std cout with lt lt 在 ANSI 系统中 不知道它是在哪里确定的 它工作得很好 它打印了字符串 现在 在 Unicode 系统中 我得到的是十六进制地址而不是字符串 那么 为什么LP
  • Request.Form 和 Request.QueryString 之间的区别?

    有人可以告诉我两者之间的确切区别吗Request Form and Request QueryString 我知道一个区别 比如 如果HTTP请求方式为POST 则用户提交的数据在申请表 收藏 如果HTTP请求方法是GET 则用户提交的数据
  • C++ 联合数组和变量?

    在C 中没有办法做这样的事情吗 union Scalar x y Scalar v 2 Where x v 0 and y v 1 既然您使用的是 C 而不是 C 并且它们具有相同的类型 为什么不直接将 x 设为对 v 0 的引用 将 y
  • 如何创建和使用类箭头运算符? [复制]

    这个问题在这里已经有答案了 因此 在到处研究之后 我似乎找不到如何创建类箭头运算符 即 class Someclass operator gt 我只需要知道如何使用它并正确使用它 它的输入是什么 它返回什么 我如何正确地声明 原型化它 运算
  • 在Framework 4.6项目中使用.net core DLL

    我已经在 net core 2 0 中构建了一个 DLL 现在我想在使用 net 4 6 1 框架的 WinForms 项目中使用它 我可以引用该 dll 但收到 System IO FileLoadException 表示找不到 Syst
  • asp.net mvc GET 请求上的 formcollection 应该为空

    我正在发布一个简单的操作 public void Login FormCollection formCollection 即使查询字符串值很少 formcollection Count is 0 是靠行为吗 FormCollection 使

随机推荐