这是我在这个网站上的第一个问题,所以请随意突出我的单词选择,问题结构等问题.
最近,我dynamic_cast在处理多态时开始使用,我读过dynamic_cast它不会创建该类的另一个实例,而是创建另一个指向该对象的实例.
在测试时dynamic_cast,我遇到了这个问题.这是代码:
//main.cpp
#include <iostream>
class Base{
public:
int BaseNum;
virtual void BaseFunction(){};
};
class Derived : public Base{
public:
int DerivedNum;
virtual void DerivedFunction(){};
};
int main(){
Base * ptrBase = new Base;
ptrBase->BaseNum = 0;
Derived * ptrDerived = dynamic_cast<Derived *>(ptrBase);
ptrDerived->DerivedNum = 1;
std::cout << ptrBase->BaseNum << ptrDerived->DerivedNum << std::endl;
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该计划在该行中崩溃:
ptrDerived->DerivedNum = 1;
Run Code Online (Sandbox Code Playgroud)
在调试时,它说"无法读取内存".我的结论是,如果原始内存分配是为层次结构中较高的类保留的,我不能贬低,但我想我可能错了.
代码在哪里出错了?
以嵌套类的教育代码为例:
class enclose {
struct nested { // private member
void g() {}
};
public:
static nested f() { return nested{}; }
};
int main() {
//enclose::nested n1 = e.f(); // error: 'nested' is private
enclose::f().g(); // OK: does not name 'nested'
auto n2 = enclose::f(); // OK: does not name 'nested'
n2.g(); }
Run Code Online (Sandbox Code Playgroud)
将此代码复制并粘贴到Microsoft Visual Studio 2012时,我收到错误
static nested f() { return nested{}; }
Run Code Online (Sandbox Code Playgroud)
其中问题是关于函数返回嵌套的方式.这不是我第一次看到代码以这种方式返回值,但我通常会忽略它并以更长的方式执行它.这是编译器问题吗?
在观察另一个人的代码时,我意识到在A类的方法中,他声明了一个与A类属性同名的本地int.例如:
//classA.h
class A{
int Data;
void MethodA();
};
Run Code Online (Sandbox Code Playgroud)
//classA.cpp
#include "classA.h"
using namespace std;
void A::MethodA(){
int Data; //local variable has same name as class attribute
Data = 4;
//Rest of Code
}
Run Code Online (Sandbox Code Playgroud)
我发现很奇怪编译器会在不返回错误的情况下接受它.在上述情况下,是否将4分配给本地数据或A :: Data,以及在更复杂的情况下会导致哪些问题?
c++ ×3
attributes ×1
class ×1
dynamic-cast ×1
inheritance ×1
local ×1
polymorphism ×1
return ×1
variables ×1