C++ C++;如何检查两个CLS是否来自同一对象
在准备考试时遇到此问题,请简要解释。C++ C++;如何检查两个CLS是否来自同一对象,c++,class,inheritance,c++11,C++,Class,Inheritance,C++11,在准备考试时遇到此问题,请简要解释。 如果我有一个类对象和另一个:类点:公共对象 现在,如果我得到Object&O1和Object&O2,但是Object也可以是点 所以我的主要问题是如何检查它们是否都是点,因为我需要访问对象没有的字段 以下是两个类: 类对象{ 公众: 一些功能 }; 类点:公共对象{ 双x; 双y; 公众: 相同的功能不同的实现 }; 我想访问x,y,但我需要首先确保它是一个点 提前感谢您可以使用dynamic\u cast Object &o = ...; if(
如果我有一个
类对象
和另一个:类点:公共对象
现在,如果我得到
Object&O1
和Object&O2
,但是Object
也可以是点
所以我的主要问题是如何检查它们是否都是
点
,因为我需要访问对象
没有的字段
以下是两个类:
类对象{公众:
一些功能
}; 类点:公共对象{
双x;
双y;
公众:
相同的功能不同的实现
};
我想访问x,y,但我需要首先确保它是一个
点
提前感谢您可以使用dynamic\u cast
Object &o = ...;
if(Point *p = dynamic_cast<Point*>(&o)) {
// ...
}
要使其工作,必须在对象
中至少有一个虚拟
函数(如果只有析构函数) 您可以使用动态投影
Object &o = ...;
if(Point *p = dynamic_cast<Point*>(&o)) {
// ...
}
要使其工作,必须在对象
中至少有一个虚拟
函数(如果只有析构函数) 它可能是草率的,但是如果你有一个指向某个对象的指针或引用,你总是可以调用动态的\u cast。如果指针返回为null ptr,那么您就知道您的对象不是所需对象的派生类
class CBase {
virtual void dummy(){}
};
class CDerived: public CBase {
int a;
};
int main () {
try {
CBase * pba = new CDerived;
CBase * pbb = new CBase;
CDerived * pd;
pd = dynamic_cast<CDerived*>(pba);
if (pd==0) cout << "Null pointer on first type-cast" << endl;
pd = dynamic_cast<CDerived*>(pbb);
if (pd==0) cout << "Null pointer on second type-cast" << endl;
} catch (exception& e) {cout << "Exception: " << e.what();}
return 0;
}
类CBase{
虚拟空虚拟对象(){}
};
类别C派生:公共CBase{
INTA;
};
int main(){
试一试{
CBase*pba=新的CDerived;
CBase*pbb=新的CBase;
CDerived*pd;
pd=动态浇铸(pba);
如果(pd==0)cout,它可能会很松散,但如果您有一个指向某个对象的指针或引用,则始终可以调用动态转换。如果指针返回为nullptr,则您知道您的对象不是所需对象的派生类
class CBase {
virtual void dummy(){}
};
class CDerived: public CBase {
int a;
};
int main () {
try {
CBase * pba = new CDerived;
CBase * pbb = new CBase;
CDerived * pd;
pd = dynamic_cast<CDerived*>(pba);
if (pd==0) cout << "Null pointer on first type-cast" << endl;
pd = dynamic_cast<CDerived*>(pbb);
if (pd==0) cout << "Null pointer on second type-cast" << endl;
} catch (exception& e) {cout << "Exception: " << e.what();}
return 0;
}
类CBase{
虚拟空虚拟对象(){}
};
类别C派生:公共CBase{
INTA;
};
int main(){
试一试{
CBase*pba=新的CDerived;
CBase*pbb=新的CBase;
CDerived*pd;
pd=动态浇铸(pba);
如果(pd==0)不能一般来说,如果你“需要”知道这一点,你就做错了。有一些例外,但作为一个规则,你不需要知道你“使用”的对象类型。不同的函数应声明为虚拟
,以便使用对象
执行操作的代码可以调用点
中的相关函数(如果对象是点
类型对象)
如果你想访问x
和y
,你应该通过一个虚拟函数来间接地访问它,这个虚拟函数执行需要在x
和y
上执行的任何操作。如果你真的需要在你只有(一个指向的引用或指针)的情况下触摸x
和y
一个对象
,你只是处于错误的级别。一般来说,如果你“需要”知道这一点,你就错了。有一些例外,但作为一项规则,你不需要知道你“使用”的对象类型。不同的函数应声明为虚拟
,以便使用对象
执行操作的代码可以调用点
中的相关函数(如果对象是点
类型对象)
如果你想访问x
和y
,你应该通过一个虚拟函数来间接地访问它,这个虚拟函数执行需要在x
和y
上执行的任何操作。如果你真的需要在你只有(一个指向的引用或指针)的情况下触摸x
和y
一个<代码>对象< /> >,您的位置不正确。 您可以依赖C++标准库提供的类型信息。
#include <iostream>
#include <typeinfo>
#include <string>
#include <utility>
class person
{
public:
person(std::string&& n) : _name(n) {}
virtual const std::string& name() const{ return _name; }
private:
std::string _name;
};
class employee : public person
{
public:
employee(std::string&& n, std::string&& p) :
person(std::move(n)), _profession(std::move(p)) {}
const std::string& profession() const { return _profession; }
private:
std::string _profession;
};
void somefunc(const person& p)
{
if(typeid(employee) == typeid(p))
{
std::cout << p.name() << " is an employee ";
auto& emp = dynamic_cast<const employee&>(p);
std::cout << "who works in " << emp.profession() << '\n';
}
}
int main()
{
employee paul("Paul","Economics");
somefunc(paul);
}
#包括
#包括
#包括
#包括
班主任
{
公众:
person(std::string&&n):\u name(n){}
虚拟常量std::string&name()常量{return\u name;}
私人:
std::string _name;
};
类别雇员:公众人士
{
公众:
员工(std::string&&n,std::string&&p):
人(std::move(n)),_职业(std::move(p)){}
常量std::string&profession()常量{return\u profession;}
私人:
std::string\u profession;
};
void somefunc(const person&p)
{
如果(类型ID(员工)=类型ID(p))
{
STD::CUT您可以依赖C++标准库提供的类型信息。
#include <iostream>
#include <typeinfo>
#include <string>
#include <utility>
class person
{
public:
person(std::string&& n) : _name(n) {}
virtual const std::string& name() const{ return _name; }
private:
std::string _name;
};
class employee : public person
{
public:
employee(std::string&& n, std::string&& p) :
person(std::move(n)), _profession(std::move(p)) {}
const std::string& profession() const { return _profession; }
private:
std::string _profession;
};
void somefunc(const person& p)
{
if(typeid(employee) == typeid(p))
{
std::cout << p.name() << " is an employee ";
auto& emp = dynamic_cast<const employee&>(p);
std::cout << "who works in " << emp.profession() << '\n';
}
}
int main()
{
employee paul("Paul","Economics");
somefunc(paul);
}
#包括
#包括
#包括
#包括
班主任
{
公众:
person(std::string&&n):\u name(n){}
虚拟常量std::string&name()常量{return\u name;}
私人:
std::string _name;
};
类别雇员:公众人士
{
公众:
员工(std::string&&n,std::string&&p):
人(std::move(n)),_职业(std::move(p)){}
常量std::string&profession()常量{return\u profession;}
私人:
std::string\u profession;
};
void somefunc(const person&p)
{
如果(类型ID(员工)=类型ID(p))
{
std::coutObject
永远不能是Point
对象&
可以是点&
(和(智能)指针一样)。有没有办法确保我在处理点而不是对象?我编辑了一个问题,我得到了Object&O1…动态投影(ptr)
你在寻找什么…通常你不需要也不应该这样做。你可能需要在对象中使用虚拟方法。找出你为什么需要x,y并给它命名。相关。对象永远不能是点
对象&
可以是点&
(智能)也可以是点&
指针)。有没有办法确保我在处理点而不是对象?我编辑了一个问题,得到了对象&O1…dynami